今天在写代码的时候遇到了正则匹配密码强度的问题
必须有大小写字母
必须有数字
必须有特殊符号(空格除外)
其中三个要满足两个,emmm 一开始想了很久正则,耽搁了很长的时间没有想出来,后来觉得不能浪费时间,就用forEach加if else 匹配单个字符…,回家后仔细学习了一下正则,发现还有很多内容
正则中 [ ] 表示查找某一个范围的字符串
范围] | 解释 |
---|---|
[abc] | 查找abc |
[a-z] | 查找a-z |
[A-Z0-9] | 查找A-Z 0-9中的字符 |
[ ^a-z] | 表示不再a-z中的字符 |
量词
量词 | 解释 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串 |
n* | 匹配任何包含零个或多个 n 的字符串 |
n? | 匹配任何包含零个或一个 n 的字符串 |
n{X} | 匹配包含 X 个 n 的序列的字符串 |
n{X,Y} | 匹配包含 X 或 Y 个 n 的序列的字符串 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串 |
n$ | 匹配任何结尾为 n 的字符串 |
^n | 匹配任何开头为 n 的字符串 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串 |
正则表达式中是没有&&的逻辑但是有||的逻辑(|)
所以第一步 必须有大小写字母:
/^(?=.*[a-z])(?=.*[A-Z])\S*$/
这一串表达式可以拆分成三部分 :
(?=.[a-z]) 表示后面的字符必须有小写字母
(?=.[A-Z]) 表示后面的字符必须有大写字母
\S 匹配除了空格的字符
匹配数字
/^(?=.*[0-9])\S*$/;
匹配特殊符号
/^(?=.*[^A-z0-9])\S*$/
然后结合(|)实现最终版本
/^((?=.*[^A-z0-9])(?=.*[0-9])|(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])|(?=.*[^A-z0-9])(?=.*[A-Z]))\S{8,}$/