2010-10-22 65 views
1

考慮下面的代碼:字邊界問題的正則表達式(重疊)

var myList = new List<string> { "red shirt", "blue", "green", "red" }; 
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b"); 
MatchCollection m = r.Matches("Alfred has a red shirt and blue tie"); 

我想要的m結果包括"red shirt", "blue", "red",因爲所有這些都是字符串,但我只得到"red shirt", "blue"。我能做些什麼來包括重疊?

回答

1

在我看來,只要找到第一個有效匹配,正則表達式解析器就會刪除匹配字符串。我現在沒有安裝Windows編譯器,所以我不能給蘋果進行蘋果比較,但我在perl中看到類似的結果。

我認爲你的正則表達式在加入後會看起來像這樣。

'\ B(紅襯衫|藍|綠|紅)\ B'

測試這個正則表達式出來我看到了相同的結果 「紅衫」, 「藍」。 將「紅襯衫」移動到正則表達式列表的末尾。

'\ B(紅色|藍色|綠色|紅色球衣)\ B'

我現在看到 「紅」, 「藍」。

通過將正則表達式更改爲更復雜一些的方法,您可能可以實現所需的結果。

\ B(藍|綠|(紅色)襯衫)\ b

這應該與紅色作爲自己的組和紅衫作爲一組爲好。

返回「紅衫」,「紅」,「藍」

更簡單的方式做這將是通過你的字符串和匹配列表1循環在時間,如果你將擁有很多字需要紅色和紅色襯衫等多項比賽的團體。

由於有很多方法可以執行regexp,我可能會缺少一個明顯而優雅的解決方案。