开发者问题收集

在 javascript 中使用正则表达式检查密码有效性

2016-01-14
915
  • 密码必须为八个字符或更长
  • 密码必须至少包含 2 个小写字母。
  • 密码必须至少包含 2 个大写字母。
  • 密码必须至少包含 2 个数字字符。
  • 密码必须至少包含 2 个特殊字符。

我的代码

function checkPass(pw) {
var regx = new RegExp("^(?=.*[a-z]{2})(?=.*[A-Z]{2})(?=.*[0-9]{2})(?=.*[!@#\$%\^&\*\)\(]{2})(?=.{8,})");
return regx.test(pw);

>

checkPass('PAssword12#$') => true
checkPass('PaSsword12#$') => false

我希望当 2 个大写字符不连续时函数返回 true。

谢谢!

2个回答

您需要使用 $ 锚点来检查长度(最好将该检查从前瞻中移出),并允许在中间插入一些非大写字母,如下所示:

function checkPass(pw) {
  var regx = /^(?=(?:[^a-z]*[a-z]){2})(?=(?:[^A-Z]*[A-Z]){2})(?=(?:\D*\d){2})(?=(?:[^!@#$%^&*)(]*[!@#$%^&*)(]){2}).{8,}$/;
  return regx.test(pw);
 }
document.write(checkPass('PAssword12#$') + "<br>");
document.write(checkPass('PaSsword12#$'));

请注意,我使用了对比原则: (?:[^a-z]*[a-z]){2 匹配 2 个除 a-z 之外的符号序列零次或多次,后跟 1 个小写字母。我以相同的方式修改了所有前瞻。

Wiktor Stribiżew
2016-01-14

与仅匹配两个大写字母的 [A-Z]{2} 不同,您必须输入可选匹配,以匹配两个不同范围之间的任何其他字符(您还必须对小写字母、数字和符号执行此操作)。因此,您应输入

[A-Z].*?[A-Z]

您实际上也不需要检查它是否至少有 8 个字符,因为任何符合小写/大写字母、数字和符号标准的密码都必须至少有 8 个字符。

John Clifford
2016-01-14