正则表达式将强密码与两个或多个特殊字符匹配

时间:2011-01-12 15:38:28

标签: javascript regex passwords

我需要使用具有以下要求的javascript匹配密码字段:

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

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

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

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

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

但不是:

@@Pssw0rdPssw0rd

我有一个随机密码生成器设置为详尽测试这个,所以任何想法都非常感谢。谢谢!

3 个答案:

答案 0 :(得分:15)

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

你的前瞻是错误的。模式

(?=.{2,}[class])

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

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

(?=.*[class])

并且由于您想要检查两次,请重复模式

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

答案 1 :(得分:3)

我不确定单个正则表达式是进行此测试的方法。

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

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;
}

答案 2 :(得分:0)

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

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