正则表达式匹配具有两个或多个特殊字符的强密码

Posted

技术标签:

【中文标题】正则表达式匹配具有两个或多个特殊字符的强密码【英文标题】:Regex match a strong password with two or more special characters 【发布时间】:2011-06-07 22:11:07 【问题描述】:

我需要使用具有以下要求的 javascript 正则表达式匹配密码字段:

至少 15 个字符 两个或多个小写字母 两个或多个大写字母 两位或多位数字 以下两个或多个特殊字符:!@#$%^&*-

我有一个处理大多数情况的正则表达式:

/^.*(?=.15,)(?=.2,\d)(?=.2,[a-z])(?=.2,[A-Z])(?=.2,[\!\@\#\$\%\^\&\*\-]).*$/

这里的问题在于符号,它适用于:

P@ssw0rdP@ssw0rd
Pssw0rdPssw0rd@@
Pssw0rd@@Pssw0rd

但不是:

@@Pssw0rdPssw0rd

我设置了一个随机密码生成器来对此进行详尽的测试,因此非常感谢任何想法。谢谢!

【问题讨论】:

我认为这不能用 one 正则表达式来完成。 @Salman:为什么不呢?听说过前瞻吗? 我建议不要这样做。在您的情况下,强制密码安全是用户创建“password1”或“PAssword!@12345”的主要原因之一。 @yorick 我认为如果用户强制执行密码安全性,他们可能会选择像p 这样的东西(我已经看到了) 我更喜欢将各种条件分解为代码中的步骤,而不是通过一个复杂的正则表达式。这样您就可以向用户报告为什么他们的密码没有通过安全验证。也更容易验证它是否确实有效。 【参考方案1】:
/^(?=(?:.*[a-z])2)(?=(?:.*[A-Z])2)(?=(?:.*\d)2)(?=(?:.*[!@#$%^&*-])2).15,$/

你的前瞻是错误的。模式

(?=.2,[class])

表示匹配 2 个或多个字符(无论是什么字符),然后匹配所需类别的 1 个字符。这与您指定的“所需类别的 2 个或更多字符”完全不同。

要正确测试所需类别的字符是否在文本中,请使用

(?=.*[class])

既然你想检查两次,重复这个模式

(?=.*[class].*[class])
# equivalent to (?=(?:.*[class])2)

【讨论】:

使用 100,000 个随机创建的密码进行测试和确认。你先生是一个正则表达式绝地,谢谢! 想补充一点,这个正则表达式适用于多平台,但如果你在 javascript 中使用它,由于 javascript 引擎中的前瞻问题,它在 IE7 中将不起作用。 link 他们为什么不让你删除 cmets?? 这个答案的投票率很低。确实“您先生是正则表达式绝地,谢谢!” @kennytm【参考方案2】:

我不确定单个正则表达式是否适合此测试。

我个人会这样实现它:(视为伪代码,我还没有测试过)

function testPassword(pw) 
    var len = pw.length;
    if(len < 15) return false;
    if(pw.replace(/[a-z]/,'').length > len - 2) return false;
    if(pw.replace(/[A-Z]/,'').length > len - 2) return false;
    if(pw.replace(/[0-9]/,'').length > len - 2) return false;
    if(pw.replace(/[!@#$%^&*-]/,'').length > len - 2) return false;
    return true;

【讨论】:

我喜欢你的想法,但我需要正则表达式,因为它可以跨多种语言工作,所以更轻松的代码重用对我来说很关键。【参考方案3】:

已经有一些很好的解释,所以我只是在堆积......

/^(?= .15 )(?= (?:.*[[:lower:]])2 )(?= (?:.*[[:upper:]])2 )(?= (?:.*[[:digit:]])2 )(?= (?:.*[!@#$%^&amp;*-])2 )/x

【讨论】:

以上是关于正则表达式匹配具有两个或多个特殊字符的强密码的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式如何匹配多行的所有任意字符

正则匹配表

正则表达式语法

正则表达式验证密码必须由大小写字母、数字、特殊字符组成

正则表达式 .*+ 匹配啥?

正则表达式:匹配指定字符后面的字符怎样实现?