我必须创建一个正则表达式,它允许在文本“*ALL”(不区分大小写)或az、AZ 和 0-9 范围内的字符中输入,这些字符长度必须为 17 个字符。我这样做没有任何问题:
^([\*][Aa][Ll][Ll]|[a-zA-Z0-9]{17})$
我遇到的问题是如何改变它,以便如果多次输入相同的字符(例如 17 个 x),它就会被拾取。
我必须创建一个正则表达式,它允许在文本“*ALL”(不区分大小写)或az、AZ 和 0-9 范围内的字符中输入,这些字符长度必须为 17 个字符。我这样做没有任何问题:
^([\*][Aa][Ll][Ll]|[a-zA-Z0-9]{17})$
我遇到的问题是如何改变它,以便如果多次输入相同的字符(例如 17 个 x),它就会被拾取。
为此,您需要使用捕获括号。这是一个概念,您用括号括起来的任何内容都将被捕获到正则表达式解析器的内存中。
因此,如果您有以下表达式:
(\w)\1+
它将匹配单个单词字符: [a-zA-Z0-9_]
以及它之后的相同字符。因为括号捕捉并记住了其中存储的内容。
所以在你的情况下:
^((?:\*[aA][lL]{2})|([a-zA-Z0-9])\1{17})$
其中 (?:) 是非捕获括号。
您还可以使用\1{1,17}
结构,这意味着字符应重复 1 到 17 次。
另一方面,我认为在这里使用正则表达式有点矫枉过正。您可能应该保存字符串,将其小写,然后将其与 '*all' 进行比较。如果它不相等,那么您可以使用正则表达式^([a-zA-Z0-9])\1{17}$
来提高可读性。
如果您的实现语言支持,您可以使用反向引用
尝试([a-zA-Z0-9])\1{16}
the\1
指的是先前匹配的组()
^(?:[\*][Aa][Ll][Ll]|([a-zA-Z0-9])\1{16})$
正则表达式的第二部分([a-zA-Z0-9])\1{16}
, 匹配一个字母数字字符,然后再重复 16 次。
如果要捕获整个事物,请删除?:
(这意味着不要捕获此组)并更改\1
为\2
:
^([\*][Aa][Ll][Ll]|([a-zA-Z0-9])\2{16})$
*ALL
*all
all
aaaaaaaaaaaaaaaaa # 17 times same character
all
ALL
aaaaaaaaaaaaaaaa # 16 times same character
aaaaaaaaaaaaaaaaaa # 18 times same character
ababababababababa # 17 times different characters
试试这个——
*[Aa][Ll][Ll]|([a-zA-Z0-9])\1{16}