我正在写Javascript验证密码的正则表达式。约束条件是:Javascript正则表达式的密码
- 密码必须包含至少一个大写字符
- 密码必须包含至少一个特殊字符
随着试验和错误,并在网上一番搜索,我发现,这工作原理:
/(?=.*[A-Z]+)(?=.*[[email protected]#\$%]+)/
是否有人可以解释这种表达,其中提到了大写字母和特殊字符可以进来的任何命令的一部分吗?
我正在写Javascript验证密码的正则表达式。约束条件是:Javascript正则表达式的密码
随着试验和错误,并在网上一番搜索,我发现,这工作原理:
/(?=.*[A-Z]+)(?=.*[[email protected]#\$%]+)/
是否有人可以解释这种表达,其中提到了大写字母和特殊字符可以进来的任何命令的一部分吗?
我认为这将更好的工作:
/(?=.*[A-Z])(?=.*[[email protected]#\$%])/
查找变通不消耗字符,因此,开始第二先行相同为先。这使得检查这两个角色彼此独立。你可以交换它们,并且生成的正则表达式仍然等同于此。
以下的正则表达式(由浓汤建议的)稍微更有效,因为它避免了不必要的回溯:
/(?=[^A-Z]*[A-Z])(?=[^[email protected]#\$%]*[[email protected]#\$%])/
在通常的长度的密码的时间差可能不会容易测量,虽然。
我觉得'+'是所需的'特殊字符'之一。而不是完全删除它,它应该在字符类'[]' – 2010-06-21 15:22:09
@理查德:加号也用于第一次预测,因此,我认为它用作量词。这并非完全错误,它只是多余的。 – SilentGhost 2010-06-21 15:23:29
@SilentGhost - 这是真的;我第一次没有注意到它。 – 2010-06-21 15:29:58
“?=”这样做。这是一个“积极先行”
从JavaScript Regular Expression Syntax
正向前查找搜索字符串在其中一个字符串匹配模式开头的点相匹配。这是一个不捕获的匹配,也就是说,匹配不会被捕获以备将来使用。例如,“Windows(?= 95 | 98 | NT | 2000)”与“Windows 2000”中的“Windows”匹配,但与“Windows 3.1”中的“Windows”匹配。预览不会消耗字符,也就是说,匹配发生后,搜索下一场比赛会在最后一场比赛之后立即开始,而不是在构成预测的角色之后开始。
?=
被称为超前测试,它将扫描字符串的其余部分以查看是否找到匹配项。通常,正则表达式逐个字符地逐个字符,但?=
告诉它“向前看”它是否存在。
还有一个?!
负面超前。
谢谢。 Silentghost的回应具有细节。 – atlantis 2010-06-21 16:06:01
你不需要加量词。你为什么要逃避'*'? – SilentGhost 2010-06-21 15:13:54
我很抱歉...由于格式问题而逃脱了*。它在我第一次发布时没有显示。也许想到标记赋予了特殊的含义,从而逃脱了它。 – atlantis 2010-06-21 15:50:45
好的,那就让我们忘记它吧。 – SilentGhost 2010-06-21 16:05:00