主题
使用正则前瞻检查密码强度
需求: 密码长度 6-12 位, 且必须包含数字、小写字母、大写字母、特殊字符(,_@#$之一)
消耗字符
- 默认情况下,正则表达式进行贪婪匹配。所谓
贪婪
,是指当匹配到多种长度的字符串时,选择最长的;而非贪婪
,就是在匹配多种长度的字符串时,选择最短的。 - 默认情况下,正则表达在匹配字符时,会把字符消耗掉;可以使用环视结构来匹配位置,使得正则不消耗字符,即正则在匹配文本时,不消耗字符,只匹配位置。
举个消耗字符的例子: 有这样一个正则/^\d+[a-z]+$/
, 匹配值为 123abc
, 结果肯定是能匹配上的,分析一下正则匹配时候的运行过程
- 在开始匹配时候, 匹配位置在数字 1 的位置,1 能被匹配
- 此时匹配的位置会向右边移动一下(左边的 1 已经看过了,不用再重新看了),移动到 2 的位置,2 也能匹配上
- 根据这个规律依次进行,直到匹配结束
- 匹配结束:匹配位置移动到最后,或者遇到不能匹配的字符(这里的例子为前者)
针对这里的需求,我们需要定几个规则 1.包含数字\d
2.包含小写字母[a-z]
3.包含大写字母[A-Z]
,4.包含[,_@#\$]
密码需要符合每一个规则,但是正则默认是会消耗字符的,若是能够不消耗字符,校验就变得简单了,前瞻就不会消耗字符
前瞻(正向预查)
语法:(?=)
, 匹配右边的字符
故名思意,就是站在某个位置向前瞻望,看前面的字符串是否符合规则,前瞻不会消耗字符
因此,校验密码强度的需求的正则可以写成
js
const reg = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[,_@#\$])[\d\w,@#\$]{6,12}$/;
这个正则表达式的组成部分解释如下:
- ^ 和 $ 分别是字符串的开始和结束锚点。
(?=.*\d)
是一个正向预查,确保字符串中至少有一个数字。(?=.*[a-z])
是一个正向预查,确保字符串中至少有一个小写字母。(?=.*[A-Z])
是一个正向预查,确保字符串中至少有一个大写字母。(?=.*[,_@#\$])
是一个正向预查,确保字符串中至少有一个指定的特殊字符。[\d\w,@#\$]{6,12}
确保整个字符串的长度在 6 到 12 个字符之间。
结果