校验密码格式的时候,使用正向预查或反向预查
预查概念
1、正向肯定预查 (?=pattern) 表示的是从其当前位置开始,预测后面的字符串必须匹配上pattern
2、正向否定预查 (?!pattern) 表示的是从其当前位置开始,预测后面的字符串必须匹配不上pattern
3、反向肯定预查 (?<=pattern) 表示的是从其当前位置开始,预测前面的字符串必须匹配上pattern
4、反向否定预查 (?<!pattern) 表示的是从其当前位置开始,预测前面的字符串必须匹配不上pattern
示例一
用户名的格式为:必须有包含数字和字符,且长度在4-8位之间
/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{4,8}$/
(?![0-9]+$)就是一个正向否定预查,表示的是预测从开始位置到结束位置不能全都是数字。
(?![a-zA-Z]+$)也是一个正向否定预查,表示的是预测从开始位置到结束位置不能全都是字符。
注:如果仅仅是^[0-9A-Za-z]{4,8}$则结果是4-8位的字母或数字。
示例二
一个6-16位的字符串,必须同时包含大小写字母和数字
let reg=/(?!^[a-zA-Z]+$)(?!^[0-9]+$)(?!^[a-z0-9]+$)(?!^[A-Z0-9]+$)^[a-zA-Z0-9]{6,16}$/;
reg.test('123456');//false
reg.test('123aaa');//false
reg.test('123AAA');//false
reg.test('123aaA');//true
//代码解析:
//先把正常的写好了:^[a-zA-Z0-9]{6,16}$
//在用负向预查 来规定不能是啥,并且写在正常合规代码的前边
//不能只是大写字母 或者小写字母 或者大小写字母的混合 (?!^[a-zA-Z]+$)
//不能只是数字 (?!^[0-9]+$)
//不能只是数字和小写字母 (?!^[a-z0-9]+$)
//不能只是数字和大写字母 (?!^[A-Z0-9]+$)
//判断完以上的不能是什么 那么只能是 ^[a-zA-Z0-9]{6,16}$ 这个了
示例三
1-10位:数字、字母、下划线组成字符串,必须有_
let reg=/(?!^[a-zA-Z0-9]+$)^\w{1,10}$/
reg.test('a');//false
reg.test('aC9');//false
reg.test('aC9_');//true
//代码解析:\w 是数字、字母、下划线
//先把正常的写好了:^\w{1,10}
//必须有_,也就是不能只是包含数字和字母 (?!^[a-zA-Z0-9]+$)