2010-06-21 144 views
1

我正在写Javascript验证密码的正则表达式。约束条件是:Javascript正则表达式的密码

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

随着试验和错误,并在网上一番搜索,我发现,这工作原理:

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

是否有人可以解释这种表达,其中提到了大写字母和特殊字符可以进来的任何命令的一部分吗?

+1

你不需要加量词。你为什么要逃避'*'? – SilentGhost 2010-06-21 15:13:54

+0

我很抱歉...由于格式问题而逃脱了*。它在我第一次发布时没有显示。也许想到标记赋予了特殊的含义,从而逃脱了它。 – atlantis 2010-06-21 15:50:45

+0

好的,那就让我们忘记它吧。 – SilentGhost 2010-06-21 16:05:00

回答

2

我认为这将更好的工作:

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

查找变通不消耗字符,因此,开始第二先行相同为先。这使得检查这两个角色彼此独立。你可以交换它们,并且生成的正则表达式仍然等同于此。

以下的正则表达式(由浓汤建议的)稍微更有效,因为它避免了不必要的回溯:

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

在通常的长度的密码的时间差可能不会容易测量,虽然。

+0

我觉得'+'是所需的'特殊字符'之一。而不是完全删除它,它应该在字符类'[]' – 2010-06-21 15:22:09

+0

@理查德:加号也用于第一次预测,因此,我认为它用作量词。这并非完全错误,它只是多余的。 – SilentGhost 2010-06-21 15:23:29

+0

@SilentGhost - 这是真的;我第一次没有注意到它。 – 2010-06-21 15:29:58

1

“?=”这样做。这是一个“积极先行”

JavaScript Regular Expression Syntax

正向前查找搜索字符串在其中一个字符串匹配模式开头的点相匹配。这是一个不捕获的匹配,也就是说,匹配不会被捕获以备将来使用。例如,“Windows(?= 95 | 98 | NT | 2000)”与“Windows 2000”中的“Windows”匹配,但与“Windows 3.1”中的“Windows”匹配。预览不会消耗字符,也就是说,匹配发生后,搜索下一场比赛会在最后一场比赛之后立即开始,而不是在构成预测的角色之后开始。

+0

谢谢。 Silentghost的回应具有细节。 – atlantis 2010-06-21 16:06:37

+0

该链接非常有用...再次感谢! – atlantis 2010-06-21 16:10:08

2

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

还有一个?!负面超前。

+0

谢谢。 Silentghost的回应具有细节。 – atlantis 2010-06-21 16:06:01