正则表达式(引用数据类型)
1. 创建正则表达式
// 字面量
let reg1 = /\d{5,}@qq.com/
// 内置构造函数
let reg1 = new RegExp(“\d{5,}@qq\.com”)
格式:new RexExp(“\正则表达式\”,“gi”)\g:全局;i:忽略大小写
2.应用场景
QQ邮箱、身份证号、密码等等有需要设置“字串格式”的场景
3.正则表达式里面的符号
元字符
. : 匹配非换行(\n)的任意字符
\ : 转译符号,把有意义的 符号 转换成没有意义的 字符,把没有意义的 字符 转换成有意义的 符号
\n
换行符
\t
制表符
4~8个空白 会自动找上一行的制表符去对齐
\r
回车符
回到行首\n\r
\
\u
Unicode字符集的码点
\u0f12
\s : 匹配空白字符(空格/制表符/回车/换行)
\S : 匹配非空白字符
\d : 匹配数字
digit数字
\D : 匹配非数字
\w : 匹配单词字符
字母、数字、下划线
\W : 匹配非数字字母下划线
中文:[\u4e00-\u9fa5]
19968
40869
限定符
a* : 前一个内容重复至少 0 次,也就是可以出现 0 ~ 正无穷 次
a+ : 前一个内容重复至少 1 次,也就是可以出现 1 ~ 正无穷 次
a? : 前一个内容重复 0 或者 1 次,也就是可以出现 0 ~ 1 次
a{n} : 前一个内容重复 n 次,也就是必须出现 n 次
a{n,} : 前一个内容至少出现 n 次,也就是出现 n ~ 正无穷 次
a{n,m} : 前一个内容至少出现 n 次至多出现 m 次,也就是出现 n ~ m 次
边界符
^ : 表示开头
$ : 表示结尾
特殊符号
() : 限定一组元素
[abc] : 字符集合,表示写在 [] 里面的任意一个都行
[^abc] : 反字符集合,表示写在 [^] 里面之外的任意一个都行
a-z : 范围,比如 a-z 表示从字母 a 到字母 z 都可以
| : 或,正则里面的或 (aaa|bbb) 表示字母 a 或者 b 都可以
标示符
g : 表示全局匹配
这个 g 是写在正则的最后面的
/\w/g
就是全局匹配字母数字下划线
global 全局的
i : 表示忽略大小写
这个 i 是写在正则的最后面的
/a-z/i
就是在正则匹配的时候不去区分大小写
ignore 忽略
m:多行模式
y:粘性模式
配置
var reg = /\d+/gim
new RegExp(“\d+”,“gim”)
贪婪与非贪婪
var reg1 = /(.)\d+/
贪婪模式(默认模式)
把字串拿完
var reg2 = /(.?)\d+/
非贪婪模式
只拿一个类型的子串,留另外类型的子串给别人
特殊选择
exp1(?=exp2):查找 exp2 前面的 exp1
(?<=exp2)exp1:查找 exp2 后面的 exp1。
exp1(?!exp2):查找后面不是 exp2 的 exp1。
(?<!exp2)exp1:查找前面不是 exp2 的 exp1。
4.正则表达式的方法
①reg.test(str)
test 是用来检测字符串是否符合我们正则的标准
语法: 正则.test(字符串)
返回值: boolean
o
②reg.exec(str)//匹配符合要求的子串(只能找出一个)+检索位置
exec 是把字符串中符合条件的内容捕获出来(匹配检索)
语法: 正则.exec(字符串)
返回值: 把字符串中符合正则要求的第一个子串(以及一些其他信息),以数组的形式返回
分组内容
/(大区码)-(地区码)-(年份)-(月份)-(日期)-(尾号)/
执行匹配得到的数组
[“4-23456-2020-07-01-4321”,“4”,“23456”,“2020”,“07”,“01”,“4321”,index:666,input:“字符串内容”]
o
5.字符串的方法
①match
match 找到字符串中符合正则条件的内容返回
语法: 字符串.match(正则)
返回值 :
没有标示符 g 的时候,是和 exec 方法一样
有标示符 g 的时候,是返回一个数组,里面是匹配到的每一项
6.正则表单验证——邮箱注册
/*
·模拟用户注册,当用户点击提交表达时进行合法性验证
·验证邮箱是否合法,不合法则显示提示信息
·验证密码是否合法,不合法则显示提示信息,6-12位字母数字特殊符号的组合(!@#$%^&*)
// ---------------------------------------------------------
*选做:密码强度:弱=只包含一种字符 强=同时包含三种字符且长度超过12位 中=其它情形
*输入的同时实时显式密码强度
*/
let str = "abcdabcd123abcd456abcd789abcd";
let reg = /\d{3}/g;
console.log(
str.match(reg) //['123', '456', '789']
);
②search
search 是查找字符串中是否有满足正则条件的内容
语法: 字符串.search(正则)
返回值 : 有的话返回开始索引,没有返回 -1
let str = "abcdabcd123abcd456abcd789abcd";
let reg = /\d{6}/;
console.log(str.search(reg));
//-1
③replace
replace 是将字符串中满足正则条件的字符串替换掉
语法: 字符串.replace(正则,要替换的字符串)
返回值 : 替换后的字符串
例子:
let str = "asdasdasdfuckasdasdasdhhasdshitadasdHhasdad你妹啊";
let regDirty = /(fuck|shit|damn|你妹)/g;
console.log(str.replace(regDirty, (sub) => sub.replace(/./g, "*")));//asdasdasd****asdasdasdhhasd****adasdHhasdad**啊
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>11_正则表单验证</title>
<style>
* {
margin: 0;
padding: 0;
}
span {
color: red;
display: none;
}
</style>
</head>
<body>
<h1>注册页面</h1>
邮箱:<input id="ipEmail" type="text" /><span id="spInfo1"
>请输入正确的邮箱地址</span
><br />
密码: <input id="ipPwd" type="text" /><span id="spInfo2"
>密码长度为6~20个单词字符</span
><br />
<button id="btn">注册</button>
<!-- valid合法的 invalid非法的 -->
<script>
const reg =
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
// 至少八个字符,至少一个字母,一个数字和一个特殊字符
const reg2 =
/^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$/;
// 至少八个字符,至少一个字母和一个数字:
const reg3 = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8, }$/;
// 拿到按钮样式属性
var btn = document.querySelector("#btn");
btn.addEventListener("click", function (e) {
// 接受输入的内容
const Email = ipEmail.value.trim();
const Pwd = ipPwd.value.trim();
// 如果pwd满足则进入判断密码属不属于合法但弱
if (!reg2.test(Pwd)) {
reg3.test(Pwd) || (Pwd.length >= 6 && Pwd.length <= 12)
? alert("合法但弱")
: alert("6-12位字母数字特殊符号的组合");
}
// 如果pwd不属于弱以及合法则进入此判断
else {
reg.test(Email)
? alert("合法强")
: alert("6-12位字母数字特殊符号的组合");
}
});
</script>
</body>
</html>