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

时间:2018-09-04 15:25:29

标签: regex

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

在正则表达式中不可能吗?我是否只需要使用我所写的语言进行范围检查?很好,但我认为保留所有正则表达式语法会更清洁。谢谢

2 个答案:

答案 0 :(得分:3)

正则表达式^([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]*$匹配一个或多个大写字符,然后匹配一个零或多个数字,并断言字符串的结尾。 $

答案 1 :(得分:3)

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

^([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