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

rwy*_*and 10 javascript regex passwords

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

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

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

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

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

P@ssw0rdP@ssw0rd
Pssw0rdPssw0rd@@
Pssw0rd@@Pssw0rd
Run Code Online (Sandbox Code Playgroud)

但不是:

@@Pssw0rdPssw0rd
Run Code Online (Sandbox Code Playgroud)

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

ken*_*ytm 16

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

你的前瞻是错误的.模式

(?=.{2,}[class])
Run Code Online (Sandbox Code Playgroud)

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

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

(?=.*[class])
Run Code Online (Sandbox Code Playgroud)

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

(?=.*[class].*[class])
# equivalent to (?=(?:.*[class]){2})
Run Code Online (Sandbox Code Playgroud)