【问题标题】:Regex password validation for set of rules规则集的正则表达式密码验证
【发布时间】:2018-02-10 10:17:24
【问题描述】:

我有以下密码验证规则:

  • 至少 8 个字符
  • 至少 1 个大写字母
  • 至少 3 个小写字母
  • 至少 1 个号码
  • 至少 1 个特殊字符
  • 起始字符必须是字母(大写或小写)
  • 行中最多 2 个相同字符 (例如 Passs123! 应该是无效的,但 sPass123! 有效)

我试图找到这个规则的正则表达式模式,最接近的是:

/^(?=.*[0-9]) (?=.*[!@#$%^&*]) (?=.*[a-z]) (?=.*[A-Z]) {8} $/

但它不适用于所有规则。

我是正则表达式的新手,如果我有任何可以学习正则表达式的资源,我将不胜感激。

【问题讨论】:

    标签: regex validation passwords


    【解决方案1】:

    您可以考虑以下模式:

    ^(?=.*[0-9])(?=.*[^\w\s])(?=(?:[^a-z]*[a-z]){3})(?=.*[A-Z])(?!.*(.)\1{2})[a-zA-Z].{7,}$
    

    参见regex demo(注意\n 添加到[^a-z] 仅用于测试演示目的,以免在单个多行输入中跨越换行符溢出)。

    详情

    • ^ - 字符串开头
    • (?=.*[0-9]) - 1 位数
    • (?=.*[^\w\s]) - 任何 1 个特殊字符(不是单词,也不是空白字符)(注意:如果您只想从列表中获取特殊字符,请使用 (?=.*[!@#$%^&*]) 与原始模式一样)
    • (?=(?:[^a-z]*[a-z]){3}) - 3 个小写字母
    • (?=.*[A-Z]) - 1 个大写字母
    • (?!.*(.)\1{2}) - 没有相同的 3 个连续字符
    • [a-zA-Z] - 第一个字符是字母
    • .{7,} - 然后是 7+ 个字符
    • $ - 字符串结束

    要了解有关密码验证的更多信息,请参阅Lookahead Example: Simple Password Validation

    请注意,您可以使用principle of contrast 来增强前瞻检查:将(?=.*[0-9]) 替换为(?=[^0-9]*[0-9]),将(?=.*[A-Z]) 替换为(?=[^A-Z]*[A-Z]),将(?=.*[^\w\s]) 替换为(?=[\w\s]*[^\w\s])

    【讨论】:

    • 条件3 lowercase letters 不起作用。 PASS123! 匹配正则表达式。
    • @ikleschenkov 它可以工作,它在演示中不起作用,只是因为[^a-z] 构造也匹配换行符。这是一个更合适的链接 - regex101.com/r/g4gptV/2,其中 [^a-z] 变成 [^\na-z] 只是因为演示包含单个多行字符串。在实际场景中,这些行是独立的字符串。
    • @WiktorStribiżew 我从您的解决方案中学到了很多东西。 +1 总是很好地解释它:-)
    猜你喜欢
    • 2011-05-06
    • 2016-10-19
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多