正则表达式以检测字符串中的重复

是否可以使用正则表达式检测重复的数字模式?

因此,例如,如果我有以下字符串“034503450345”,是否可以匹配重复序列0345? 我有一种感觉,这超出了正则表达式的范围,但我想我无论如何都会问这里,看看我是否错过了什么。

是的,你可以 – 这是一个Python测试用例

import re print re.search(r"(\d+).*\1", "8034503450345").group(1) # Prints 0345 

正则表达式说“找到一些数字序列,然后找到任何数量的其他东西,然后再找到相同的序列。”

在几乎没有相关的说明中,这是我最喜欢的正则表达式之一 – 素数检测器:

 import re for i in range(2, 100): if not re.search(r"^(xx+)\1+$", "x"*i): print i 

此表达式将匹配一个或多个重复组:

 (.+)(?=\1+) 

这是相同的表达式,(使用注释,因此它仍然可以直接用作正则表达式)。

 (?x) # enable regex comment mode ( # start capturing group .+ # one or more of any character (excludes newlines by default) ) # end capturing group (?= # begin lookahead \1+ # match one or more of the first capturing group ) # end lookahead 

要匹配特定模式,请将.+更改为该模式,例如\d+表示一个或多个数字,或\d{4,}更改为4个或更多数字。

要匹配特定数量的模式,请更改\1+ ,例如更改为\1{4}四次重复。

为了使重复不会彼此相邻,您可以添加.*? 在前瞻中。

只是为RichieHindle的(正确)答案添加注释:

请注意,虽然Python的regexp实现(以及许多其他实现,例如Perl)可以做到这一点,但这不再是狭义上的正则表达式。

您的示例不是常规语言,因此无法通过纯正则表达式处理。 有关详细信息,请参阅优秀的维基百科文章 。

虽然这主要只是学术兴趣,但有一些实际后果。 与这种情况相比,真正的正则表达式可以更好地保证最大运行时间。 所以你可能会在某些时候遇到性能问题。

并不是说它不是一个好的解决方案,但你应该意识到你正处于正则表达式(即使是扩展forms)能够的极限,并且可能想要在出现问题时考虑其他解决方案。

这是C#代码,它使用反向引用构造来查找重复的数字。 它将与034503450345,123034503450345,034503450345345,232034503450345423一起使用。正则表达式更容易理解。

 ///  /// Assigns repeated digits to repeatedDigits, if the digitSequence matches the pattern ///  /// true if success, false otherwise public static bool TryGetRepeatedDigits(string digitSequence, out string repeatedDigits) { repeatedDigits = null; string pattern = @"^\d*(?\d+)\k+\d*$"; if (Regex.IsMatch(digitSequence, pattern)) { Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); repeatedDigits = r.Match(digitSequence).Result("${repeat}"); return true; } else return false; } 

使用正则表达式重复:bar {2,}查找带有两个或更多bar的文本:barbar barbarbar …