是否可以使用正則表達式檢測重複的數字模式?用於檢測字符串內重複的正則表達式
因此,例如,如果我有以下字符串「034503450345」,是否可以匹配重複序列0345?我有一種感覺,這超出了正則表達式的範圍,但我想我會問這裏,看看我是否錯過了一些東西。
是否可以使用正則表達式檢測重複的數字模式?用於檢測字符串內重複的正則表達式
因此,例如,如果我有以下字符串「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
您的素數檢測器發現0和1是質數:-) – balpha 2009-06-03 10:02:08
這個表達式將匹配一個或多個重複的組:
(.+)(?=\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的正則表達式實現(和許多其他人,比如Perl的)能做到這一點,這不再是在正則表達式這個詞的狹義。
您的示例不是常規語言,因此無法通過純正則表達式處理。見例如詳情請見優秀Wikipedia article。
雖然這主要只是學術上的興趣,但也有一些實際的後果。真正的正則表達式可以爲最大運行時提供比這種情況更好的保證。所以你可能會在某個時候遇到性能問題。
不是說這不是一個好的解決方案,但是你應該意識到你處於正則表達式(即使是擴展形式)的能力範圍內,並且可能需要考慮其他解決方案以防出現問題。
這是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;
}
使用正則表達式的重複: 酒吧{2} 查找具有兩個或多個欄文字: BARBAR barbarbar ...
什麼語言/平臺您使用? – 2009-06-03 09:55:18
我正在使用C#。我所需要的只是正則表達式,所以我已經實現了RichieHindle的解決方案,並且已經根據我的測試數據對其進行了驗證!我也從Peter Boughton出色的正則表達式中學到了很多東西。謝謝你們兩位! – 2009-06-03 10:12:27
@MarkWithers我正在處理同樣的問題。你能更具體一些,告訴我更多關於你的解決方案的信息嗎?謝謝 – user2179427 2016-01-18 13:29:33