Javascript 使用regex进行复杂密码验证

Javascript 使用regex进行复杂密码验证,javascript,regex,Javascript,Regex,我正在尝试创建一个javascript正则表达式用于密码验证。接受密码的规则如下 应包含12个或更多字符 应包含以下特殊字符之一*^ 至少两个大写字符 至少两个数字 至少一个小写字符 我在网上找到了一个示例,并对其进行了如下修改 (?=.*[0-9]{2,})(?=.*[a-z])(?=.*[A-Z]{2,}).{12,} 但是,这仍然忽略了特殊字符要求,仅当大写字符和数字在后续顺序中时才起作用。这些是我用这个得到的结果 aMMericano11 - true aMmeRican1o1 -

我正在尝试创建一个javascript正则表达式用于密码验证。接受密码的规则如下

  • 应包含12个或更多字符
  • 应包含以下特殊字符之一
    *^
  • 至少两个大写字符
  • 至少两个数字
  • 至少一个小写字符
我在网上找到了一个示例,并对其进行了如下修改

(?=.*[0-9]{2,})(?=.*[a-z])(?=.*[A-Z]{2,}).{12,}
但是,这仍然忽略了特殊字符要求,仅当大写字符和数字在后续顺序中时才起作用。这些是我用这个得到的结果

aMMericano11 - true
aMmeRican1o1 - false
我希望第二个也能被接受,当然还要加上一些特殊的字符


有人能帮我吗?

不管我对任意密码规则无效的讽刺评论,你一下子做的太多了

您要做的是“它是否有12个或更多的字母和来自
*^!
的符号,以及至少两个大写字母、至少两个数字和至少一个小写字母”

你应该做的是:

  • 它有12个字母还是更多?如果没有,请失败并请求更长的密码
  • 它有符号吗?如果没有,请失败并请求一个符号
  • 它至少有两个大写字母吗?如果没有,失败并要求他们
  • 它至少有两个号码吗?如果没有,失败并要求他们
  • 它至少有一个小写字母吗?如果没有,失败并要求它

将大问题分解为小问题,您将获得更好的用户体验,因为您可以准确地告诉用户您希望从他们那里得到什么。

问题在于前瞻性:

(?=.*[0-9]{2,})
此模式要求文本中出现模式
[0-9]{2,}
(例如,2位数字)。你可能想要的是:

(?=(.*[0-9]){2,})
这允许数字由其他字符分隔,而不是连续

同样的问题也适用于大写字母规则。将其拼凑在一起,最终表达式将是:

(?=(.*[0-9]){2,})(?=.*[\*^!])(?=.*[a-z])(?=(.*[A-Z]){2,}).{12,}

当且仅当密码满足有效性规则时,表达式才会匹配。如果需要更大的粒度(例如,检测特定规则被违反),您可能需要将表达式拆分为更小的表达式。

同意@Niet the Dark Absol

但是,如果您想使用regEx执行此操作,请将其分解为:

'ab2c3F*ghijKM'.match(/[\w\W]{12,}/) //Should contain 12 characters or more

'ab2c3F*ghijKM'.match(/[*^!]/) //Should contain one of these special characters * ^ !

'ab2c3F*ghijK'.match(/[A-Z]/g).length>=2 //At least two uppercase characters

'ab2c3F*ghijK'.match(/[\d]/g).length>=2 //At least two numbers characters

'23Fa*K'.match(/[a-z]/) //At least one lowercase characters
然后对所有这些表达式应用&&操作

例如:


好的,我要注册。。。密码,让我看看。。。“密码”。好的,太短了。“password1234”足够长了。哦,需要一个符号。。。“密码1234!@#$”。。。大写?好吧“密码1234!@#$”。最后[一周后]好的,我要登录这个网站。。。妈的,我的密码是什么?哈哈,我明白。这是我的课程工作要求之一。他们希望我们学习regex并实现它。“使用regex进行复杂密码验证”-不,使用其他东西。当然不是正则表达式。不。@n00b\u c0der请通知您的教授,您只选择参与良好的编程实践,不会将自己降低到这种愚蠢的程度。通过评论,他需要正则表达式来完成课堂作业,否则,我同意。@David regex仍然可以用于各个部分。例如,
.match(/[A-Z].[A-Z]/)
测试两个大写字母。为什么不在最后一个正则表达式中使用
(?=(.[0-9]){2,})
?现在这两个数字必须是连续的…@对立面谢谢你指出,我修正了代码
var pass = 'ab2cFg*hij3KM';
var isValidInput = pass.match(/[\w\W]{12,}/) && pass.match(/[*^!]/) && (pass.match(/[A-Z]/g).length>=2) && (pass.match(/[\d]/g).length>=2) && pass.match(/[a-z]/)
if(isValidInput) {
    console.log('valid')
} else {
    console.log('invalid')
}