我正在尝试创建一个与重复模式或两个或更多字符(不包括单个重复字符)匹配三遍或更多遍的正则表达式。
(.)\1{3,}
将匹配一个重复的字符,例如匹配aaaa
,但不匹配ababab
或abcde
(.+)\1{3,}
将匹配重复的模式,例如aaa
,ababab
,ab ab ab
,但不是abcde
我只想匹配ababab
,ab ab ab
等
但不是aaaa
或abcde
如何解决此问题?
答案 0 :(得分:3)
如果您想在所有字符都相同的情况下放弃匹配,则可以使用否定的前瞻来拒绝匹配。在其他情况下,可以在捕获第一部分的量词中将+
更改为{2,}
,然后使用{2,}
,以使匹配的第一部分重复三遍或三遍以上。您可以使用此正则表达式,
^(?!(.)\1+$)(.{2,})\2{2,}$
说明:
^
-字符串的开头(?!(.)\1+$)
-这种否定的前瞻性确保了直到字符串末尾字符串仅由一个字符组成,然后才拒绝匹配。(.{2,})
-匹配两个或多个任意字符并将其捕获到group2中\2{2,}
-重复在group2中捕获的内容两次或更多次$
-字符串结尾另外,从您的帖子中可以看出,您不想匹配aaaa
,因为它的aa
模式仅重复两次,而不是重复三次或多次,所以我是正确的,并且您认为aaaaaa
是成功的匹配项,因为它现在aa
重复了三遍,在这种情况下,您可以摆脱上面的正则表达式的负前瞻,并使用与{{1 }},但会像我上面解释的那样匹配aaaa
。
aaaaaa
让我知道这是否确实是您想要的。如有任何疑问,请随时发表评论。
答案 1 :(得分:2)
您可以使用此正则表达式:
^((.)\2*?(?!\2).+?)\1{2,}$
第一部分((.)\2*?(?!\2).+?)
与其中至少包含2个不同字符的字符串匹配,然后将其重复至少2次\1{2,}
。
从第一部分开始,我们首先匹配第一个字符,将其放在第2组中。然后,允许该字符重复几次,或者不重复(\2*
)。然后,我们断言除了该字符(?!\2)
之外还必须有其他东西。然后我们懒惰地匹配其余的.+?
。
答案 2 :(得分:0)