2009-06-03 104 views
8

是否可以使用正則表達式檢測重複的數字模式?用於檢測字符串內重複的正則表達式

因此,例如,如果我有以下字符串「034503450345」,是否可以匹配重複序列0345?我有一種感覺,這超出了正則表達式的範圍,但我想我會問這裏,看看我是否錯過了一些東西。

+1

什麼語言/平臺您使用? – 2009-06-03 09:55:18

+0

我正在使用C#。我所需要的只是正則表達式,所以我已經實現了RichieHindle的解決方案,並且已經根據我的測試數據對其進行了驗證!我也從Peter Boughton出色的正則表達式中學到了很多東西。謝謝你們兩位! – 2009-06-03 10:12:27

+0

@MarkWithers我正在處理同樣的問題。你能更具體一些,告訴我更多關於你的解決方案的信息嗎?謝謝 – user2179427 2016-01-18 13:29:33

回答

9

是的,你可以 - 這裏是一個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 
+0

您的素數檢測器發現0和1是質數:-) – balpha 2009-06-03 10:02:08

19

這個表達式將匹配一個或多個重複的組:

(.+)(?=\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})更改爲四次重複。

爲了讓重複不會彼此相鄰,您可以在預覽內添加.*?

8

剛剛從RichieHindle註釋添加到(正確的)答案:

注意的是,雖然Python的正則表達式實現(和許多其他人,比如Perl的)能做到這一點,這不再是在正則表達式這個詞的狹義。

您的示例不是常規語言,因此無法通過純正則表達式處理。見例如詳情請見優秀Wikipedia article

雖然這主要只是學術上的興趣,但也有一些實際的後果。真正的正則表達式可以爲最大運行時提供比這種情況更好的保證。所以你可能會在某個時候遇到性能問題。

不是說這不是一個好的解決方案,但是你應該意識到你處於正則表達式(即使是擴展形式)的能力範圍內,並且可能需要考慮其他解決方案以防出現問題。

2

這是C#代碼,它使用反向引用構造來查找重複的數字。它將與034503450345,123034503450345,034503450345345,232034503450345423一起工作。正則表達式更容易理解,更易於理解。

/// <summary> 
/// Assigns repeated digits to repeatedDigits, if the digitSequence matches the pattern 
/// </summary> 
/// <returns>true if success, false otherwise</returns> 
public static bool TryGetRepeatedDigits(string digitSequence, out string repeatedDigits) 
{ 
    repeatedDigits = null; 

    string pattern = @"^\d*(?<repeat>\d+)\k<repeat>+\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; 
} 
0

使用正則表達式的重複: 酒吧{2} 查找具有兩個或多個欄文字: BARBAR barbarbar ...

相關問題