我必须创建一个正则表达式,允许在a-z,A-Z和0-9范围内的文本“* ALL”(不区分大小写) OR 字符中,这些字符长度必须为17个字符。我没有遇到任何问题:
^([\*][Aa][Ll][Ll]|[a-zA-Z0-9]{17})$
我遇到的问题是如何改变它,以便只要输入相同的字符(例如17 x)就可以接收它。
答案 0 :(得分:7)
为了做到这一点,你需要使用捕捉括号。这是一个概念,其中用括号括起来的任何内容都将被捕获到正则表达式解析器的内存中。
因此,如果您有以下表达式:
(\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}$
来获得更多的可读性。
答案 1 :(得分:2)
如果您的实现语言支持,您可以使用反向引用
尝试([a-zA-Z0-9])\1{16}
\1
指的是先前匹配的群组()
答案 2 :(得分:2)
^(?:[\*][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
答案 3 :(得分:0)
试试这个 -
*[Aa][Ll][Ll]|([a-zA-Z0-9])\1{16}