【问题标题】:Greedy regex quantifier not matching password criteria贪婪的正则表达式量词与密码条件不匹配
【发布时间】:2019-04-22 22:18:52
【问题描述】:
/(^[a-zA-Z]+-?[a-zA-Z0-9]+){5,15}$/g

正则表达式标准
匹配长度必须介于 6 到 16 个字符之间(含)
只能以字母开头
必须包含字母、数字和一个可选连字符
不能以连字符结尾

上述正则表达式不满足所有 4 个条件。尝试将^ 移到组之前并省略+ 量词但不起作用

【问题讨论】:

  • 什么语言?
  • 好吧,至少我的正则表达式强制数字存在。
  • 您应该考虑限制密码的安全影响。请参阅Reference - Password Validation 了解更多信息。密码长度不应限制为 16,最小密码长度应至少增加到 8,并且应重新考虑密码结构限制。

标签: regex testing passwords


【解决方案1】:

您正在对已经具有量化子模式的组设置限制量词,因此长度限制将不起作用。

要设置长度限制,请在^ 之后添加(?=.{6,16}$) 前瞻,然后随意设置您的消费模式。

你可以使用

/^(?=.{6,16}$)[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)?$/

请参阅regex demo。请注意,在针对正则表达式验证整个输入字符串时,不应使用 g 修饰符。

详情

  • ^ - 字符串开头
  • (?=.{6,16}$) - 允许/需要在字符串输入中包含 6 到 16 个字符
  • [a-zA-Z] - 一个字母作为第一个字符
  • [a-zA-Z0-9]* - 0+ 个字母数字字符
  • (?:-[a-zA-Z0-9]+)? - - 的可选序列,然后是 1+ 字母数字字符
  • $ - 字符串结束。

【讨论】:

    【解决方案2】:

    你需要的一切

    ^(?i)(?=.{6,16}$)(?!.*-.*-)[a-z][a-z\d-]*\d[a-z\d-]*(?<!-)$
    

    可读

     ^ 
     (?i)
     (?= .{6,16} $ )               # 6 - 16 chars
     (?! .* - .* - )               # Not 2 dashes
     [a-z]                         # Start letter
     [a-z\d-]*                     # Optional letters, digits, dashes
     \d                            # Must be digit
     [a-z\d-]*                     # Optional letters, digits, dashes
     (?<! - )                      # Not end in dash
     $ 
    

    好吧,至少我的正则表达式强制存在一个数字。

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多