RegEx - 密码强度

时间:2016-09-12 08:08:26

标签: regex passwords

我试图制作正则表达式只允许密码,在这种情况下强大的定义为:

  • 必须以字母(大写或小写)开头
  • 必须至少包含8个字符且最多12个字符
  • 必须至少有一个大写字母
  • 必须至少有三个小写字母
  • 必须至少有两个数字
  • 必须至少有两个特殊字符
  • 相同连续字符的最大数量为3

现在,最后一个给我带来了麻烦。如何统计连续的字符?

例如,FOOfoo!?123应该有效,但FOOOfoo!?12不应该(因为或三个esses)。

到目前为止我得到了什么:

^[A-Za-z]{1}(?=.*[A-Z]{1,})(?=.*[a-z]{3,})(?=.*[0-9]{2,})(?=.*[!?@*#&$]{2,}).{8,12}$

还有一件事:有些事情不对,因为我的正则表达式声称像FooFoo!?123这样的字符串是无效的。我认为它是因为它只检查一个或多个大写字母三个或更多个小写字母数字特价,但我不想要那个,我希望密码包含三个小写字母总计,它应该是有效的。我该怎么做?

1 个答案:

答案 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]匹配
  • 要匹配3个字母全局,而不是连续,我们需要在分组上使用限制量词,而不是字符类,因此{{1} }(=连续3个或更多个小写字母)变为[a-z]{3,}(= 3个非小写字母序列,后跟1个小写字母)。
  • 您需要的条件是(?:[^a-z]*[a-z]){3} - 一个负前瞻((?!.*(‌​.)\1{2})),用于检查是否存在使用(?!...)捕获的任何字符,该字符在{{1}后重复两次在反向引用上设置反向引用和(.)限制量词集。 \1表示重复的字符可能出现在字符串中的任何位置。