2010-05-05 109 views
1

如果我有字符串hello world,我該如何修改正則表達式world|wo|w,以便它匹配所有「world」,「wo」和「w」,而不僅僅是匹配「world」的第一個匹配項。如何防止正則表達式在第一次匹配時停止?

如果這是不可能的,是否有一個很好的解決方法?我使用C#如果它有所作爲:

Regex testRegex = new Regex("world|wo|w"); 
MatchCollection theMatches = testRegex.Matches("hello world"); 
foreach (Match thisMatch in theMatches) 
{ 
    ... 
} 
+0

你究竟是什麼意思? – SLaks 2010-05-05 13:35:48

回答

2

我認爲你將需要使用三個單獨的正則表達式並匹配它們中的每一個。當您指定替代品時,它會認爲每個替代品都是成功的匹配,並且會在匹配其中一個後停止匹配。我能看到做的唯一方法就是用一個單獨的正則表達式重複搜索。您可以創建一個數組或匹配項列表,並且如果您希望稍後能夠遍歷它們,則將每個搜索添加到列表中。

+0

感謝大家的回答,即使答案不是我所希望的!在我的實際情況中,正則表達式中的替代方法列表可能會有數千年,所以我將不得不重新考慮這一點。 – mikel 2010-05-05 22:49:14

1

如果您嘗試三次匹配單詞world(開頭),則需要使用三個單獨的正則表達式對象;一個正則表達式不能匹配兩次相同的字符。

1

正如SLaks寫道的,正則表達式不能多次匹配相同的文本。

你可以 「假的吧」 這樣的:

\b(w)((?<=w)o)?((?<=wo)rld)? 

將匹配w,僅如果先進行w *的o,並rld僅如果先進行wo

當然,實際上只匹配單詞的一部分,但通過查看捕獲的組,您可以看到只有第一個,前兩個或所有部分匹配。

所以在字want,該w將匹配(其餘是可選的,所以正則表達式報告全面成功

work,在wo將匹配; \1將包含w,並\2將包含o。該rld會失敗,但因爲它是可選的,正則表達式仍然報告成功。

我添加了一個字邊界錨\b的正則表達式的開始,以避免在話像中間匹配3210;如果不想排除這些匹配,請刪除\b


* (?<=w)在這裏實際上並不需要,但爲了保持一致性,我一直保留它。

相關問題