2010-11-10 118 views
1

任何人都可以請告訴我如何找到匹配給定正則表達式的給定字符串的最長子字符串?拆分最長的正則表達式匹配子字符串

+0

潛在匹配之間可以有重疊嗎?也許一些示例字符串和正則表達式有助於說明問題。 – 2010-11-10 10:27:34

+0

例如,假設我有一個正則表達式「[] +」,它匹配一個或多個空格。如果我有字符串「測試<-spaces->」。我希望能夠匹配「測試」和「。」之間的所有空格。 – Miguel 2010-11-10 10:28:52

+0

您可以編輯您的原始問題以添加示例。無需在評論框中填充它。 – 2010-11-10 11:01:13

回答

6

通常,正則表達式引擎會查找字符串中最左邊最長的匹配項(除非您明確地告訴它不要)。

所以正則表達式X+將永遠匹配在testXXXXX.

但是,如果字符串中存在多個潛在匹配項,則標準find方法將始終找到第一個,而不一定是最長匹配(例如,在test1XXtest2XXXXX.中)。要在這裏找到最長的匹配,您需要使用正則表達式引擎的findall方法,然後測量所有匹配的長度。

在C#中,這可能是這樣的:

StringCollection resultList = new StringCollection(); 
Regex regexObj = new Regex("[ ]+"); 
Match matchResult = regexObj.Match(subjectString); 
while (matchResult.Success) { 
    resultList.Add(matchResult.Value); 
    matchResult = matchResult.NextMatch(); 
} 

(在此之後,發現在​​中最長的字符串。)

這裏有一個問題,不過,如果潛在的匹配可以重疊。舉個例子,正則表達式

AB+A 

和字符串

ABABBA 

如果應用正則表達式,你只能找到ABA因爲正則表達式引擎在第一場比賽之後消耗的第二A,所以它開始第二次嘗試在BBBA,當然失敗了。這是「最左邊最長」行爲的後果,如果你想規避這種情況,你必須「手動」重新應用正則表達式到整個字符串,然後到整個字符串減去第一個字符,然後到整串減去前兩個字符等。

+0

爲了解決重疊問題,可以將可能會在預見中重疊的部分放置,以免它被佔用。 – 2011-03-15 02:19:20

0

循環遍歷匹配並比較長度。

+0

如果潛在的匹配重疊,那將失敗。 – 2010-11-10 10:28:00