我试图制作正则表达式只允许强密码,在这种情况下强大的定义为:
现在,最后一个给我带来了麻烦。如何统计连续的字符?
例如,FOOfoo!?123
应该有效,但FOOOfoo!?12
不应该(因为或三个esses)。
到目前为止我得到了什么:
^[A-Za-z]{1}(?=.*[A-Z]{1,})(?=.*[a-z]{3,})(?=.*[0-9]{2,})(?=.*[!?@*#&$]{2,}).{8,12}$
还有一件事:有些事情不对,因为我的正则表达式声称像FooFoo!?123
这样的字符串是无效的。我认为它是因为它只检查一个或多个大写字母或三个或更多个小写字母或数字或特价,但我不想要那个,我希望密码包含三个小写字母总计,它应该是有效的。我该怎么做?
答案 0 :(得分:1)
当你有这么多条件时,如果您的环境允许,可能是一个好主意 - 分割正则表达式并分别检查每个条件。
如果你不能这样做,这里是固定正则表达式的自由间距版本:
^ # start of string
(?=[^A-Z]*[A-Z]) # At least 1 uppercase ASCII letter
(?=(?:[^a-z]*[a-z]){3}) # at least 3 lowercase ASCII letters
(?=(?:[^0-9]*[0-9]){2}) # at least 2 ASCII digits
(?=(?:[^!?@*#&$]*[!?@*#&$]){2}) # at least 2 special symbols
(?!.*(.)\1{2}) # No 3 consecutive characters
[A-Za-z] # An ASCII letter
.{7,11} # 7 to 11 any characters but newline
$ # end of string
作为一个单行:
^(?=[^A-Z]*[A-Z])(?=(?:[^a-z]*[a-z]){3})(?=(?:[^0-9]*[0-9]){2})(?=(?:[^!?@*#&$]*[!?@*#&$]){2})(?!.*(.)\1{2})[A-Za-z].{7,11}$
请参阅regex demo
注意:
[a-z]
之前,我们可能有0 +对应的字符与[^a-z]
匹配[a-z]{3,}
(= 3个非小写字母序列,后跟1个小写字母)。(?:[^a-z]*[a-z]){3}
- 一个负前瞻((?!.*(.)\1{2})
),用于检查是否存在使用(?!...)
捕获的任何字符,该字符在{{1}后重复两次在反向引用上设置反向引用和(.)
限制量词集。 \1
表示重复的字符可能出现在字符串中的任何位置。