我需要使用具有以下要求的javascript匹配密码字段:
我有一个正则表达式来处理大多数情况:
/^.*(?=.{15,})(?=.{2,}\d)(?=.{2,}[a-z])(?=.{2,}[A-Z])(?=.{2,}[\!\@\#\$\%\^\&\*\-]).*$/
这里的问题是符号,它适用于:
P@ssw0rdP@ssw0rd Pssw0rdPssw0rd@@ Pssw0rd@@Pssw0rd
但不是:
@@Pssw0rdPssw0rd
我有一个随机密码生成器设置为详尽测试这个,所以任何想法都非常感谢。谢谢!
答案 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