“至少包含字母和数字”这类要求需要用先行断言。下面这条规则用两个 (?=...) 分别要求字母与数字,再限定长度与字符集。
默认正则
/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*?&]{8,20}$/
8-20 位,且同时包含字母与数字,允许常见特殊符号。
密码规则通常要求长度与字符类型组合。单纯写字符类无法表达“必须包含某类字符”,需要借助先行断言。
(?=.*[A-Za-z]) 表示从当前位置向后必须能找到字母,(?=.*\d) 表示必须能找到数字,两者都是零宽断言不消耗字符。
最后用 [A-Za-z\d@$!%*?&]{8,20} 限定总长度与允许字符。该规则不包含空格与中文。
abc12345Passw0rd!a1b2c3d4abcdefgh12345678abc123abcdefghijklmnopqrstuQ:为什么要用 (?=...) 先行断言?
因为需要“必须包含某类字符”,而普通字符类只能描述“允许哪些字符”,无法强制某类字符至少出现一次。
Q:为什么 abcdefgh 不匹配?
虽然长度足够,但缺少数字,未满足 (?=.*\d) 的要求。
Q:能要求包含大小写和符号吗?
可以。使用密码(强)规则,它用四个先行断言分别要求小写、大写、数字与特殊符号。
Q:正则能判断密码强度吗?
正则可判断“是否满足规则”,但强度还取决于是否泄露、是否复用等,需要综合评估。