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

时间:2014-05-26 15:49:50

标签: javascript regex

我正在尝试为密码验证创建一个javascript正则表达式。接受密码的规则是

  • 应包含12个字符或更多
  • 应包含其中一个特殊字符* ^ !
  • 至少两个大写字符
  • 至少两个数字
  • 至少一个小写字符

我在网上找到了一个示例,并将其修改为如下

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

然而,这仍然缺少特殊字符要求,只有在大写字符和数字按后续顺序排列时才有效。这些是我用这个结果得到的结果

aMMericano11 - true
aMmeRican1o1 - false

我希望第二个也被接受,当然还要添加特殊字符。

有人可以帮我吗?

3 个答案:

答案 0 :(得分:6)

无视我对任意密码规则无效的讽刺评论,你试图立刻做太多。

你正在做的是“它有12个字母或更多字母和*^!的符号,至少两个大写字母和至少两个数字以及至少一个小写字母”......

你应该做的是:

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

将大问题分解为小问题,最终会有更好的用户体验,因为您可以告诉用户完全你想要什么。

答案 1 :(得分:5)

问题在于前瞻:

(?=.*[0-9]{2,})

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

(?=(.*[0-9]){2,})

这允许数字由其他字符分隔,而不是连续。

同样的问题适用于大写字母规则。拼凑这个,最后的表达式是:

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

当且仅当密码符合有效性规则时,表达式才匹配。如果需要更多粒度(例如,为了检测违反特定规则),您可能需要将表达式分解为更小的表达式。

答案 2 :(得分:0)

同意@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')
}