密码的Javascript正则表达式

时间:2010-06-21 15:09:02

标签: javascript regex

我正在编写用于在Javascript中验证密码的正则表达式。约束是:

  1. 密码必须至少包含一个大写字符
  2. 密码必须至少包含一个特殊字符
  3. 通过反复试验和网上搜索,我发现这有效:

    /(?=.*[A-Z]+)(?=.*[!@#\$%]+)/
    

    有人可以解释一下这个表达的部分,它提到大写字母和特殊字符可以按任意顺序出现吗?

3 个答案:

答案 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”。前瞻不消耗字符,也就是说,在匹配发生后,搜索下一个匹配在最后一个匹配之后立即开始,而不是在包含前瞻的字符之后。