排除重复单个字符的正则表达式

3

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

(.)\1{3,} 只会匹配单个重复字符,例如匹配 aaaa ,但不匹配 ababababcde

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

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

如何解决这个问题?


1
aabaabaab 会被认为是匹配吗? - Tim Biegeleisen
你是在匹配整个输入字符串吗?还是它们可能存在于更大的文本中? - revo
匹配项可能存在于更大的文本中。 - ToeNail
aabaabaab 是匹配的,因为字符串 aab 重复出现。 - ToeNail
如果它可能存在于更大的文本中,它是发生在单独的一行还是在其他单词之间?因为下面所有的答案都假设它是在单独的一行而不是在其他文本之间发生的。 - revo
你在哪个工具中使用这个正则表达式? - revo
3个回答

2

如果您想在所有字符相同的情况下放弃匹配,可以使用负向先行断言来拒绝。否则,您可以将量词中的+更改为{2,},以捕获第一部分,然后使用{2,},使匹配的第一部分重复三次或更多次。您可以使用以下正则表达式:

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

解释:

  • ^ - 字符串的开头
  • (?!(.)\1+$) - 这个负向先行断言确保如果字符串一直到结尾只包含一个字符,则拒绝匹配。
  • (.{2,}) - 匹配两个或更多任意字符,并在组2中捕获它
  • \2{2,} - 重复在组2中捕获的内容两次或更多次
  • $ - 字符串的结尾

正则表达式演示1

此外,根据您的帖子,您不想匹配aaaa,因为它只重复了aa模式两次而不是三次或更多次,所以如果我理解正确并且您认为aaaaaa是一个成功的匹配,因为现在它有aa重复三次,那么您可以从我的上面的正则表达式中去掉负向先行断言,并使用这个正则表达式,它将不匹配aaaa,但会像我上面解释的那样匹配aaaaaa

^(.{2,})\1{2,}$

正则表达式演示2

如果这确实是您想要的,请告诉我。如果有任何疑问,请随时留下您的评论。


1
这也有效,谢谢!抱歉,如果我的陈述不够清晰,但我不想匹配aaaaaa,因为它只包含单个字符。 - ToeNail
1
@ToeNail:那么我对你的帖子的第一个假设和我的第一个解决方案是正确的。顺便说一句,我用更简单的解决方案第一次并且正确地回答了你的帖子。 - Pushpesh Kumar Rajwanshi
1
抱歉,我先看到了 @Sweeper 的解决方案,因为它在顶部,所以没有看到你的帖子。感谢您的帮助! - ToeNail
@ToeNail:没问题:)很高兴能帮忙。虽然除了我的答案先发布外,它也更易读和可维护。但是选择正确答案取决于您。 - Pushpesh Kumar Rajwanshi

2
你可以使用这个正则表达式:

^((.)\2*?(?!\2).+?)\1{2,}$
< p > 第一部分 ((.)\2*?(?!\2).+?) 匹配至少有两个不同字符的字符串,然后将其重复至少两次\1{2,}

将第一部分分解,首先匹配第一个字符,将其放入第二组中。然后我们允许该字符重复几次,或者不重复 (\2*)。然后我们断言必须有其他不同于此字符的东西(?!\2)。然后我们懒惰地匹配剩下的部分.+?

演示


这个有效,谢谢。它需要匹配更长文本中的字符串,所以我不能只删除^和$。 - ToeNail
删除锚点在较大的文本中应该是可行的,但这需要相当长的时间。我不确定是否有可能使这个过程更快。作为一种解决方法,可以通过某个分隔符拆分较大的文本,然后检查每个拆分是否符合正则表达式?@ToeNail - Sweeper

0
也许你可以检查一下你要匹配的长度:
(.{2,})\1{3,}

演示

Regulex图表

enter image description here


你的正则表达式匹配了 aaaaaaaa - revo
@revo 是的,这是正确的,因为它匹配了三次 aa。他没有将其排除在外。 - ALFA
抱歉如果我的陈述不够清晰,但我想排除只包含单个字符的字符串。@Sweeper已经清楚地回答了这个问题。 - ToeNail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接