2011-12-07 25 views
2

我一直在玩正在使用正則表達式從字符串檢索數據,主要是作爲我自己的練習。我試圖要匹配的模式看起來像這樣:C#正則表達式,檢索用逗號分隔的兩個單詞,括號運算符

"(SomeWord,OtherWord)" 

閱讀一些文件,看着我得出的結論備忘單之後,下面的正則表達式應該給我2場比賽:

"\((\w),(\w)\)" 

由於根據文檔括號應執行以下操作:

(模式)與模式匹配和記住匹配。匹配的 子串可以使用Item [0] ... [n]從結果匹配集合 中檢索。要匹配括號字符(),請使用「\(」或 「\)」。

但是使用下面的代碼(刪除錯誤檢查簡潔)匹配非常不同的東西:

string line = "(A,B)"; 
string pattern = @"\((\w),(\w)\)"; 
MatchCollection matches = Regex.Matches(line, pattern); 
string left = matches[0].Value; 
string right = matches[1].Value; 

現在我希望留下來成爲「A」,併成爲「B」的權利。然而,左變成了「(A,B)」,並且根本沒有第二次比賽。我在這裏錯過了什麼?

(我知道這個例子很簡單沒有正則表達式,但要學會如何正確地使用正則表達式我應該可以做一些簡單的,因爲這解決工作)

回答

2

你想第一場比賽的Groups成員。在你的例子中,只有1個匹配,這是整個字符串。在Groups集合中,您將有3個項目。試試這個示例代碼,左邊應該是A,右邊應該是B.如果你看看group[0]的值,它將是整個字符串。

string line = "(A,B)"; 
string pattern = @"\((\w),(\w)\)"; 
MatchCollection matches = Regex.Matches(line, pattern); 
GroupCollection groups = matches[0].Groups; 
string left = groups[1].Value; 
string right = groups[2].Value; 
+0

嘿pstrjds,這的確做到了,我會接受在幾分鐘內你的答案!由於文檔明確地談論了匹配項目,所以我沒有想到看看組。謝謝你的幫助! –

+3

對。 MatchCollection是針對模式的匹配集合,而不是模式中標識的字符串集合。如果輸入是「'(A,B)blah(C,D)'」,則在MatchCollection中會有兩個匹配 - 一個用於「(A,B)」,另一個用於「 ,D)'',與'matches [0] .Groups [1] .Value ==「A」','matches [0] .Groups [2] .Value ==「B」','matches [1] .Groups [1] .Value ==「C」',和'matches [1] .Groups [2] .Value ==「C」'。 'Groups [0]'總是包含匹配的整個字符串:'matches [0] .Groups [0] .Value ==「(A,B)」'​​和'matches [1] .Groups [0] .Value ==「(C,D)」'。 –

1

\w比賽只有一個字字符。如果字必須包含至少一個字符,表達應該是:

string pattern = @"\((\w+),(\w+)\)"; 

如果詞語可能是空的:

string pattern = @"\((\w*),(\w*)\)"; 

+:用於一個或多個重複。

*:表示零,一次或多次重複。

在任何情況下,您將得到一個包含三個組的匹配,第一個包含整個字符串,包括左括號和右括號,其他兩個單詞。

0

首先,它是一個 「匹配」,2 「團體」 ......

我建議你命名組反正...

string pattern = @"\((?<FirstWord>\w+),(?<SecondWord>\w+)\)"; 

那麼你可以做...

Match m = Regex.Match(line, pattern); 

string firstWord = m.Groups["FirstWord"].Value; 
1

我認爲問題是,你混淆一個matchgroup的概念。

一個MatchCollection包含匹配整個正則表達式,不只是正則表達式內的括號組字符串列表。例如,如果你搜索的字符串看起來像這樣...

(A,B)(C,D) 

...那麼你將有兩場比賽:(A,B)(C,D)

然而,有個好消息:你可以從每場比賽得到group,希望能非常容易,就像這樣:

string line = "(A,B)"; 
string pattern = @"\((\w),(\w)\)"; 
MatchCollection matches = Regex.Matches(line, pattern); 
string left = matches[0].Groups[1].Value; 
string right = matches[0].Groups[2].Value; 

Groups變量是括號組從單一的匹配的集合。

編輯: 奧利維爾Jacot-Descombes取得了很好的一點:我們都得到了這麼掛了解釋比賽對我們忘了通知第二個問題組:\w將只匹配單個字符。您需要添加一個量詞(如+)以便一次抓取多個字符。奧利維爾的回答應該清楚地解釋這一部分。

0

由於您正在尋找的是用逗號分隔的字符,因此您可以簡單地使用\ w作爲您的模式。該比賽將是A和B.

測試您的正則表達式的一個方便網站爲http://gskinner.com/RegExr/

相關問題