繁体   English   中英

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

[英]Regex match a strong password with two or more special characters

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

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

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

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

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

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

但不是:

 @@Pssw0rdPssw0rd 

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

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

你的前瞻是错误的。 模式

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

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

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

(?=.*[class])

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

(?=.*[class].*[class])
# equivalent to (?=(?:.*[class]){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;
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM