2012-11-19 48 views
6

我想寫一個匹配逗號分隔的單詞列表並捕獲所有單詞的正則表達式。該行應該匹配   apple , banana ,orange,peanut ,並且捕獲應該是apple,banana,orange,peanut。要做到這一點我用正則表達式如下:奇數正則表達式的行爲 - 只匹配第一個和最後一個捕獲組

^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$ 

它成功地匹配字符串,但突然之間只有applepeanut被捕獲。這種行爲在C#和Perl中都可以看到。因此,我認爲我錯過了關於正則表達式匹配如何工作的一些事情。有任何想法嗎? :)

回答

3

match.Groups[2].Value通過給出的值僅是由所述第二組捕獲的最後值。

要找到所有值,i範圍看match.Groups[2].Captures[i].Value其中在這種情況下,從02。 (除了match.Groups[1].Value對第一組)

(!+1的問題,我今天學到了一些東西)

+0

+1我不確定.net是否具有此功能,並且懶得檢查。 – stema

+0

@stema我甚至沒有意識到這是一個問題,我認爲所有的值都會在'Groups'中出現! – Rawling

+0

感謝您指向'.Captures'集合!最後,我想出了使用相同的正則表達式,因爲我提出了問題,然後我做了for(int i = 1; i bazzilic

2

你是repeating your capturing group,在每次重複的匹配之前先前的內容被覆蓋。所以最後只有第二個捕獲組的最後一場比賽可用。

您可以在第二組改變你的第二個捕獲組到

^\s*([a-z_]\w*)((?:\s*,\s*(?:[a-z_]\w*))*)\s*$ 

那麼結果將是「香蕉,橘子,花生」。我不確定,如果你想要這個。

如果您想檢查字符串是否具有該模式並提取每個單詞。我會分兩步做。

  1. 用您的正則表達式檢查模式。

  2. 如果模式正確,請刪除前導空格和尾部空格,然後拆分\s*,\s*

3

試試這個:

string text = " apple , banana ,orange,peanut"; 

var matches = Regex.Matches(text, @"\s*(?<word>\w+)\s*,?") 
     .Cast<Match>() 
     .Select(x => x.Groups["word"].Value) 
     .ToList(); 
+2

PS:這是一個很好的網站來測試正則表達式在.NET中: [正則表達式英雄](http://regexhero.net/tester/) –

+0

我用[this one](http://regexpal.com/) – bazzilic

+1

我喜歡[this one](http://regexstorm.net/tester?p=([AZ] {2})([0-3] )(0 [1-9] | [12] \ d | 3 [01])(0 [1-9] | 1 [0-2])(\ d {2})(\ d {3})&I = KT2140210456)。 –

2

簡單的正則表達式:

(?:^| *)(.+?)(?:,|$)

說明:

?: # Non capturing group 
^| * # Match start of line or multiple spaces 
.+ # Capture the word in the list, lazy 
?: # Non capture group 
,|$ # Match comma or end of line 

注意:Rublular是一個很好的網站來測試這種事情。

相關問題