我想匹配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
在正则表达式中不可能吗?我是否只需要使用我所写的语言进行范围检查?很好,但我认为保留所有正则表达式语法会更清洁。谢谢
答案 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。