正则表达式量词不限制匹配



我想匹配 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

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

行为是预期的。编写以下模式时:

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

{1,8}量词告诉正则表达式重复以前的模式,因此在这种情况下,捕获组重复一到八次。由于您的操作员的贪婪,您将无限期地匹配和捕获。


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

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

在此处查看工作演示。

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

您可以使用积极的前瞻(?=[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]*$匹配一次或多次大写字符,后跟零次或多次数字,并断言字符串的末尾。$

最新更新