使用正则表达式的复杂密码验证

Complex password validation using regex

本文关键字:密码 验证 复杂 正则表达式      更新时间:2023-09-26

我试图为密码验证创建一个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

然后应用&&对所有这些表达式的操作

,

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')
}