我正在尝试为密码验证创建一个javascript正则表达式。接受密码的规则是
* ^ !
我在网上找到了一个示例,并将其修改为如下
(?=.*[0-9]{2,})(?=.*[a-z])(?=.*[A-Z]{2,}).{12,}
然而,这仍然缺少特殊字符要求,只有在大写字符和数字按后续顺序排列时才有效。这些是我用这个结果得到的结果
aMMericano11 - true
aMmeRican1o1 - false
我希望第二个也被接受,当然还要添加特殊字符。
有人可以帮我吗?
答案 0 :(得分:6)
无视我对任意密码规则无效的讽刺评论,你试图立刻做太多。
你正在做的是“它有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')
}