【问题标题】:Javascript Regular Expression for Password密码的 Javascript 正则表达式
【发布时间】:2010-06-21 15:09:01
【问题描述】:

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

  1. 密码必须至少包含一个大写字符
  2. 密码必须至少包含一个特殊字符

经过反复试验和在网上搜索,我发现这是可行的:

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

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

【问题讨论】:

  • 那里不需要加量词。你为什么要逃避*
  • 对不起...由于格式问题而转义了 *。我第一次发帖时没有显示。认为标记可能赋予特殊含义并因此逃脱了它。
  • 好吧,那我们就别管它了。

标签: javascript regex


【解决方案1】:

我认为这会更好:

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

look-arounds 不消耗字符,因此,第二个look-ahead 的开始与第一个相同。这使得检查这两个字符彼此独立。您可以交换它们,生成的正则表达式仍然与此等效。

以下正则表达式(由 Gumbo 建议)效率稍高一些,因为它避免了不必要的回溯:

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

不过,对于通常长度的密码,时间差可能不容易测量。

【讨论】:

  • 我认为+ 是所需的“特殊字符”之一。而不是完全删除它,它应该在字符类[]
  • @Richard: plus 也用在第一个前瞻中,因此,我认为它被用作量词。这不是完全错误,只是多余。
  • @SilentGhost - 这是真的;一开始我没注意到。
  • 让它更聪明一点:/(?=[^A-Z]*[A-Z])(?=[^!@#\$%]*[!@#\$%])/。这样可以避免不必要的回溯。
  • 感谢@SilentGhost 的详细解释! @Richard:如上所述,我使用 + 作为量词。现在我明白为什么它是多余的了。我不明白关于“不必要的回溯”的部分:(一个小的解释会很棒!
【解决方案2】:

?= 称为前瞻,它将扫描字符串的其余部分以查看是否找到匹配项。通常,正则表达式逐个字符,但 ?= 告诉它“前瞻”以查看它是否存在。

?! 也有一个负前瞻。

【讨论】:

  • 谢谢。 Silentghost 的回复有详细信息。
【解决方案3】:

“?=”就是这样做的。这是一个“积极的前瞻”

来自JavaScript Regular Expression Syntax

Positive Lookahead 在字符串匹配模式开始的任何位置匹配搜索字符串。这是一个非捕获匹配,即不捕获该匹配以供以后可能使用。例如,“Windows (?=95|98|NT|2000)”匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。 Lookaheads 不消耗字符,也就是说,在匹配发生后,对下一个匹配项的搜索将在最后一个匹配之后立即开始,而不是在组成lookahead 的字符之后。

【讨论】:

  • 谢谢。 Silentghost 的回复有详细信息。
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2010-11-18
相关资源
最近更新 更多