我想匹配 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]*$
匹配一次或多次大写字符,后跟零次或多次数字,并断言字符串的末尾。$