一、正则
1、特殊元字符
\d 代表数字 0-9
\ 字符串中的转义 就是把字符串中有特殊含义的字符 转成字符本身(不代表任何含义)只会转义一位
\D 代表除了数字以外的其他字符
\w 代表数字或者字母或下划线
\W 代表数字字母下划线以外的其他字符
^ 代表以什么开头 若写就得写在正则的最前面
$ 代表以什么结尾 若写就得写在正则的最后边
[A-Z] 代表的是大写字母
[a-z] 代表的是小写字母
[a-zA-Z] 代表所有字母
a|b 代表a或b
?= 代表正向预查
. 代表除了换行以外的其他字符 若在[]里面就代表点本身了;
() 提升优先级 分组(捕获时用到的概念)
2、量词元字符
? 代表前面的字符出现0或者1次
+ 代表前面的字符出现1到多次
* 代表前面的字符出现0到多次
{n} 代表前面的字符出现n次
{n,} 代表前面的字符出现n次到多次
{n,m} 代表前面的字符出现n到m次
3、修饰符
g (global) 全局匹配 最多用于捕获 匹配时很少用
i (ignoreCase) 忽略大小写
m (multiline) 多行匹配
二、正则的应用
1、手机号
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<input type="text" placeholder="输入手机号" id="inp" />
<button id="btn">登录</button>
</body>
</html>
<script>
let reg = /^1[3-9]\d{9}$/;
btn.onclick = function () {
let val = inp.value; // 用户输入的内容
let bol = reg.test(val);
if (bol) {
alert("登录成功")
} else {
alert("手机号不合法");
}
};
</script>
2、QQ邮箱
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<input type="text" placeholder="输入QQ邮箱" id="inp" />
<button id="btn">登录</button>
</body>
</html>
<script>
let reg = /^\d{5,11}\@qq\.com$/;
btn.onclick = function () {
let val = inp.value; // 用户输入的内容
let bol = reg.test(val);
if (bol) {
alert("登录成功");
} else {
alert("邮箱不合法");
}
};
</script>
3、身份证号
<script>
// 身份证的匹配
// 130425199110151013 前17位是数字 最后一位数子或者X
let reg = /^\d{17}(\d|X)$/
let reg2 = /^\d{17}[\dX]$/
</script>
4、18-65的工作年龄段
// 18-65 的工作年龄段 /[18-65]/
// 18-19 20-59 60-65 /[20-59]/ 2或者0到5或者9; 一位数字
// '34'
let reg = /^(1[89]|[2-5]\d|6[0-5])$/
reg.test('25') //true
reg.test('14') //false
5、弱密码校验
// 密码只能是有 数字 字母 _ . - + @ $ 组成的8到15位字符 弱校验
let reg = /^[\w\.\-+@$]{8,15}$/
6、强密码校验
// 密码必须包含大字母 小写字母 数字 (_.-+@$) 8到15位
let reg = /^(?=.*[A-Z]).{8,15}$/
三、捕获
- 捕获的贪婪性 一次获取 会尽可能多的去获取内容 想解决这个贪 就在量词后边 加一个?
- 捕获的懒惰行 只获取一次;解决这个懒 使用修饰符 g
<script src>
var str = '你好2009你好2022';
var reg = /\d+/ // reg.lastIndex代表的就是当次匹配或者捕获 对应字符串的开始索引
// reg.test(str) execAll
console.log(reg.test(str))
console.log(reg.test(str))
console.log(reg.exec(str))
// console.log(reg.exec(str))
RegExp.prototype.execAll = function (str) {
// this --> reg
if (!this.global) {
throw new Error("没加g")
}
this.lastIndex = 0; // 防止这个正则的lastIndex不是0而导致获取到的内容不对
let ary = []
// 想ary中填充内容
let qq = this.exec(str)
while (qq) {
ary.push(qq[0])
qq = this.exec(str)
}
return ary
}
console.log(reg.execAll(str)) // ==> ['2009','2022']
1、URL解析
let str = 'https://www.baidu.com/s?qq=111&www=222&ee=333'
function queryURL(str, key) {
let reg = /([a-z]+)=(\d+)/g
let ary = str.match(reg) //
console.log(ary)
let obj = {}
ary.forEach(item => {
let res = item.split('=')//['qq','111']
let k = res[0], v = res[1];
obj[k] = v
})
// 若用户传递了key则返回key对应的值,若没传 就返回这个对象
return key ? obj[key] : obj
}
queryURL(str) // {qq:111,www:222,ee:33}
queryURL(str, 'qq') // 111
2、千页符
//第一种
let str = '12345666.048586' // 5,123,234
function qian(str) {
let xiaoshu = str.split('.')[1]
str = str.split('.')[0]
let str2 = str.split('').reverse().join('')
let res = ''
for (let i = 0; i < str2.length; i++) {
if (i % 3 == 2) {
res += str2[i] + ','
} else {
res += str2[i]
}
}
return res.split('').reverse().join('').replace(/^,/, '') + (xiaoshu ? '.' + xiaoshu : '')
}
//第二种
function qian2(str) {
let reg = /\d(?=(\d{3})+$)/g
let xiaoshu = str.split('.')[1]
str = str.split('.')[0]
return str.replace(reg, function (a) {
return a + ','
}) + (xiaoshu ? '.' + xiaoshu : '')
}