【问题标题】:Regex quantifier not restricting match [duplicate]正则表达式量词不限制匹配[重复]
【发布时间】:2019-02-09 16:25:21
【问题描述】:

我想匹配 1 个或多个大写字母 [A-Z]+ 后跟 0 个或多个数字 [0-9]* 但整个字符串总共需要小于或等于 8 个字符。

无论我想出什么正则表达式,总长度似乎都被忽略了。这是我尝试过的。

^[A-Z]+[0-9]*{1,8}$ //Range ignored, will not work on regex101.com but will on rubular.com/

^([A-Z]+[0-9]*){1,8}$ //Range ignored

^(([A-Z]+[0-9]*){1,8})$ //Range ignored

这在正则表达式中是不可能的吗?我只需要用我所写的语言进行范围检查吗?很好,但我认为将所有内容都保留在正则表达式语法中会更干净。谢谢

【问题讨论】:

    标签: regex


    【解决方案1】:

    这种行为是预期的。当您编写以下模式时:

    ^([A-Z]+[0-9]*){1,8}$

    {1,8} 量词告诉正则表达式重复前一个模式,因此在这种情况下是捕获组,在 1 到 8 次之间。由于你的运营商的贪婪,你将无限期地匹配和捕获。


    您需要使用前瞻来获得所需的行为:

    ^(?=.{1,8}$)[A-Z]+[0-9]*$
    
    • ^ 断言字符串的开头。
    • (?=.{1,8}$) 确保后面的字符串长度在 1 到 8 个字符之间。
    • [A-Z]+[0-9]*$ 匹配任何大写字母(一个或多个)和任何数字(零个或多个)。
    • $ 断言字符串结束位置。

    查看工作演示here

    【讨论】:

      【解决方案2】:

      正则表达式 ^([A-Z]+[0-9]*){1,8}$ 将匹配 [A-Z]+[0-9]* 1 - 8 次。这将匹配例如重复 8 次 A1A1A1A1A1A1A1A1 但不匹配重复 9 次 A1A1A1A1A1A1A1A1A1

      您可以使用正数 lookahead (?=[A-Z0-9]{1,8}$) 来断言字符串的长度:

      ^(?=[A-Z0-9]{1,8}$)[A-Z]+[0-9]*$

      那会匹配

      • ^ 从字符串开始
      • (?=[A-Z0-9]{1,8}$) 正向预测以断言后面的内容与字符类 [A-Z0-9] 中的任何字符匹配 1 - 8 次并断言字符串的结尾。
      • [A-Z]+[0-9]*$ 匹配一个或多次大写字符,后跟零次或多次数字并断言字符串的结尾。 $

      【讨论】:

      • @JohnyL 因为您断言字符串 ^ 的开头,然后您想要断言右侧的内容重复 1 -8 次,这是字符类中的一个字符)和然后是字符串的结尾。如果该断言没问题,您可以匹配该模式。
      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 2016-03-17
      • 2019-02-01
      • 2012-10-31
      • 2019-09-29
      • 1970-01-01
      相关资源
      最近更新 更多