我正在编写用于在Javascript中验证密码的正则表达式。约束是:
通过反复试验和网上搜索,我发现这有效:
/(?=.*[A-Z]+)(?=.*[!@#\$%]+)/
有人可以解释一下这个表达的部分,它提到大写字母和特殊字符可以按任意顺序出现吗?
答案 0 :(得分:2)
?=
被称为前瞻,它将扫描字符串的其余部分以查看是否找到匹配项。通常情况下,正则表达式逐个字符,但?=
告诉它“先行”以查看它是否存在。
?!
还有一个负面的预测。
答案 1 :(得分:2)
我认为这会更好:
/(?=.*[A-Z])(?=.*[!@#\$%])/
环游不消耗字符,因此,第二次预测的开始与第一次预测相同。这使得对这两个字符的检查彼此独立。你可以交换它们,结果正则表达式仍然等同于此。
以下正则表达式(Gumbo建议)效率稍高,因为它避免了不必要的回溯:
/(?=[^A-Z]*[A-Z])(?=[^!@#\$%]*[!@#\$%])/
在通常长度的密码上,时差可能不容易衡量。
答案 2 :(得分:1)
“?=”就是这样做的。这是一个“积极前瞻”
来自JavaScript Regular Expression Syntax
正向前瞻与字符串匹配模式开始的任何点匹配搜索字符串。这是一种非捕获匹配,也就是说,未捕获匹配以供以后使用。例如,“Windows(?= 95 | 98 | NT | 2000)”匹配“Windows 2000”中的“Windows”,而不匹配“Windows 3.1”中的“Windows”。前瞻不消耗字符,也就是说,在匹配发生后,搜索下一个匹配在最后一个匹配之后立即开始,而不是在包含前瞻的字符之后。