RegEx用于排除重复的单个字符

时间:2019-05-16 08:38:51

标签: regex regex-negation regex-lookarounds regex-group regex-greedy

我正在尝试创建一个与重复模式或两个或更多字符(不包括单个重复字符)匹配三遍或更多遍的正则表达式。

(.)\1{3,}将匹配一个重复的字符,例如匹配aaaa,但不匹配ababababcde

(.+)\1{3,}将匹配重复的模式,例如aaaabababab ab ab,但不是abcde

我只想匹配abababab ab ab 等 但不是aaaaabcde

如何解决此问题?

3 个答案:

答案 0 :(得分:3)

如果您想在所有字符都相同的情况下放弃匹配,则可以使用否定的前瞻来拒绝匹配。在其他情况下,可以在捕获第一部分的量词中将+更改为{2,},然后使用{2,},以使匹配的第一部分重复三遍或三遍以上。您可以使用此正则表达式,

^(?!(.)\1+$)(.{2,})\2{2,}$

说明:

  • ^-字符串的开头
  • (?!(.)\1+$)-这种否定的前瞻性确保了直到字符串末尾字符串仅由一个字符组成,然后才拒绝匹配。
  • (.{2,})-匹配两个或多个任意字符并将其捕获到group2中
  • \2{2,}-重复在group2中捕获的内容两次或更多次
  • $-字符串结尾

Regex Demo 1

另外,从您的帖子中可以看出,您不想匹配aaaa,因为它的aa模式仅重复两次,而不是重复三次或多次,所以我是正确的,并且您认为aaaaaa是成功的匹配项,因为它现在aa重复了三遍,在这种情况下,您可以摆脱上面的正则表达式的负前瞻,并使用与{{1 }},但会像我上面解释的那样匹配aaaa

aaaaaa

Regex Demo 2

让我知道这是否确实是您想要的。如有任何疑问,请随时发表评论。

答案 1 :(得分:2)

您可以使用此正则表达式:

^((.)\2*?(?!\2).+?)\1{2,}$

第一部分((.)\2*?(?!\2).+?)与其中至少包含2个不同字符的字符串匹配,然后将其重复至少2次\1{2,}

从第一部分开始,我们首先匹配第一个字符,将其放在第2组中。然后,允许该字符重复几次,或者不重复(\2*)。然后,我们断言除了该字符(?!\2)之外还必须有其他东西。然后我们懒惰地匹配其余的.+?

Demo

答案 2 :(得分:0)

也许您可以检查要匹配的内容的长度:

(.{2,})\1{3,}

Demo

Regulex图

enter image description here