【问题标题】:Strong password check强密码检查
【发布时间】:2020-03-10 20:37:29
【问题描述】:

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

  • 至少有 8 个字符
  • 至少包含 1 个大写字母
  • 至少包含 1 个小写 字母
  • 至少包含 1 个数字 或至少 1 个特殊字符
  • 不要重复一个字符连续重复超过 2 次​​strong>

应匹配的示例:

  • 测试1234!
  • Te123stE

不应匹配的示例:

  • Teeest123!
  • !TESTT1234

这是我迄今为止尝试过的:

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

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

【问题讨论】:

  • “包含 1...”我认为您的意思是“包含至少 1...”:)
  • 我也看不到“Teeest123!”失败。它有 10 个字符,1 个大写,5 个小写,3 个数字,1 个特殊字符,并且不重复超过 3 次。
  • @BrootsWaymb 有 3 个“e”字符,所以如果失败是因为 OP 的意思是“不是 3 次”
  • @Bohemian - 条件是“不要重复超过 3次”
  • @Bohemian 然后 OP 需要明确地说“不是 3 次”。他们做了说的意思完全不同。更不用说检查准确的 3(但或多或少没问题)是非常具体的,我不一定认为假设这就是他们的意思是安全的。更有可能是一个糟糕的测试用例。

标签: regex regex-lookarounds regex-group


【解决方案1】:

如果您想在有 3 个或更多连续个相同字符的情况下使匹配失败,请使用(?!.*(.)\1{2})lookahead:

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

请参阅regex demo

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

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

this regex demo

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

根据principle of contrast 增强了检查小写、大写字母和特殊/数字字符的最常见的前瞻。

模式详情

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

【讨论】:

  • 第一个正则表达式几乎就是我需要的。它匹配这个字符串:TESTREGEX,它不应该,因为它不包含任何小写字母和数字/特殊字符。
  • @Mihaela 在我的答案中发布的所有正则表达式都不匹配TESTREGEX,请参阅regex #1regex #2 演示
【解决方案2】:

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

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

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 2010-11-26
    • 2014-10-26
    • 2012-06-16
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多