正则表达式常见验证问题美元验证、密码验证
1.验证是否为11位有效手机号码?
- 以1为开头
- 第二位为3,4,5,7,8中的任意一位
- 最后以0-9的9个整数结尾
var reg = /^1[34578]\d{9}$/;
console.log(reg.test('13456448948')); // true
解析:
^1 以1开头
[34578] 表示从3,4,5,7,8中任选一位匹配,放在第二位
\d 等价于[0-9]表示从0到9中任选一个
\d{9}$ 匹配9个[0-9]中的数字, $为结尾符
^$ 一起使用会精确匹配,只有满足表达式的内容才会匹配成功
2.判断是否为年月格式
- XXXX-XX
- 其中 X 为 Number 类型
var reg = /^\d{4}-(1[0-2]|0[1-9])$/;
console.log(reg.test('2021-09')); // true
解析:
^\d{4} 表示开头匹配4个[0-9]的数字
(1[0-2]|0[1-9]) 候选,表示匹配1[0-2]或者0[1-9]
3.验证美元格式
- 以 $ 符开始
- 整数部分,从个位起,满 3 个数字用 , 分隔
- 如果有小数,则小数部分长度最多为 2
- 正确的格式如:$1,123,112.33 或者 $3.06,错误的格式如:$02,876,121.12、$2,876,12.12 或者 $56,123.30
var reg = /^\$[1-9]\d{0,2}(,\d{3})*(\.[1-9]\d|\.\d[1-9])?$/;
console.log(reg.exec('$34,344.03'));
解析:
\$ 将$符转义成普通字符,以 $ 符开始
\d 表示[0-9],从0到9中匹配一个整数
* 数量词,表示>=0
\d{3} 等效于[0-9][0-9][0-9],匹配3个整数
(,\d{3})* 表示匹配大于或等于0个(,\d{3})*,满 3 个数字用 , 分隔
? 数量词,表示0或1
(.[1-9]\d|.\d[1-9])? 匹配一个(.[1-9]\d|.\d[1-9])或者不匹配,代表可以有小数也可以没有小数。
| 候选,这里是选择 .[1-9]\d 或者 .\d[1-9]
注意点:$结束符和 . 是特殊字符,不能直接使用,需要通过 \ 进行转义成普通字符
4.密码验证
- 包含大写,小写和数字,和特殊字符(!,@,#,%,&)
- 大于6位小于20位
解析:
这里用到前瞻表达式
表达式 | 名称 | 描述 |
---|---|---|
(?=exp) | 正向前瞻 | 匹配后面满足表达式exp的位置 |
(?!exp) | 负向前瞻 | 匹配后面不满足表达式exp的位置 |
// 正向前瞻
var str = 'Hello, Hi, I am Hilary.';
var reg = /H(?=i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Hello, Ti, I am Tilary.
简单来说,正向前瞻可以解释为后面一定要匹配什么
H(?=i) 表示 H 后面一定要匹配 i 才为true
密码验证问题:
var reg = /(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#%&])^([A-Za-z\d!@#%&]{6,20})$/;
console.log(regPsw.test('A2Aa1&bB&')); // true
. 表示匹配除换行符\n和回车符之外的任何单个字符,等效于 [^\n\r]
.* 表示匹配除换行和回车之外的任意个任意字符
(?=.*[A-Z]) 表示从开头到结尾,一定要匹配任意个任意字符+[A-Z],简单来说就是,一定要匹配[A-Z],也就是包含大写
[A-Za-z\d!@#%&] 表示匹配大小写、数字、特殊字符的任意一个
{6,20} 表示匹配 6 到 20 个字符,包括 6 和 20