强密码检查

Strong password check

我需要一个正则表达式来检查密码是否:

应匹配的示例:

不应匹配的示例:

这是我目前尝试的方法:

^(?!.*pass|.*Pass|.*qwer|.*Qwer)(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9#?!@$%^&*-]).{8,}$

不知道怎么匹配重复的字符。有什么想法吗?

如果有 3 个或更多 连续 个相同的字符,如果您想使匹配失败,请使用 (?!.*(.){2}) 前瞻:

^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9#?!@$%^&*-]*[0-9#?!@$%^&*-])(?!.*[pP]ass|.*[qQ]wer)(?!.*(.){2}).{8,}$

参见regex demo

如果有 3 个或更多 不一定连续 相同的字符,如果您想使匹配失败,请使用 (?!.*(.).*.*) 前瞻:

^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9#?!@$%^&*-]*[0-9#?!@$%^&*-])(?!.*[pP]ass|.*[qQ]wer)(?!.*(.).*.*).{8,}$

this regex demo

注意 更改:最有效的前瞻移动到开头(就在 ^ 之后),效率最低的移动到右边。

根据 principle of contrast.

增强了检查小写字母、大写字母和 special/digit 字符的最常见前瞻

图案详情

  • ^ - 字符串开头
  • (?=[^A-Z]*[A-Z]) - 必须至少有一个大写 ASCII 字母[=7​​2=]
  • (?=[^a-z]*[a-z]) - 必须至少有一个小写 ASCII 字母[=7​​2=]
  • (?=[^0-9#?!@$%^&*-]*[0-9#?!@$%^&*-]) - 必须至少有一个来自 0-9#?!@$%^&*- 集合的特殊字符(数字或 #?!@, $, %, ^, &, *, -)
  • (?!.*[pP]ass|.*[qQ]wer) - 字符串中不允许 pass/Passqwer/Qwer
  • (?!.*(.).*.*) - 不允许三个不一定连续的重复字符
  • .{8,} - 除换行符以外的八个或更多字符
  • $ - 字符串结尾。

您可以使用以下正则表达式:

/
(?=.*[0-9#?!@$%^&*-])       # 1+ digit or special char
(?=.*[A-Z])                 # 1+ uc letters
(?=.*[a-z])                 # 1+ lc letters
(?=[a-zA-Z0-9#?!@$%^&*-]*$) # all chars valid
(?!.*(.){2})              # no 3+ repeats
.{8,}                       # match string if length >= 8
/x                          # free-spacing mode

Demo