2011-03-21 96 views
3

新手正則表達式的問題/ C#:(*)(。*)簡單的正則表達式的問題/多重匹配

考慮;以及如何將匹配 「A = B = C」

我exepected拿到兩因爲有兩種方法可以組合和匹配:

(A = B) = (C) 

    or 

(A) = (B = C) 

但是我只找回一個匹配對象(第一種情況)。所以我想我不明白爲什麼比賽集合是一個集合 - 因爲我似乎無法獲得多個項目。有人可以解釋嗎?


僅供參考 - 對於上面的測試我只是用IMMED窗口:

?Regex.Matches("A = B = C", "(.*)=(.*)").Count 
1 

?Regex.Matches("A = B = C", "(.*)=(.*)")[0].Groups[1].Captures[0] 
Value: "A = B" 

?Regex.Matches("A = B = C", "(.*)=(.*)")[0].Groups[1].Captures[1] 
Value: "C" 
+0

實際上,該正則表達式不會與(C)部分相匹配。一旦引擎匹配第一部分,剩下的部分就是......'= C',但是你的正則表達式是要求一個字母,然後等於另一個字母。我想不出一個正則表達式可以做你正在尋找的東西,但是你的正則表達式絕對不適合你正在尋找的東西。 – DavidAndroidDev 2011-03-21 16:25:01

回答

3

Matches返回的集合包含連續的匹配項,而不是字符串的同一部分的替代匹配項。因此,如果您傳入字符串「A = B \ nC = D」,則會返回兩個匹配項:一個用於「A = B」,一個用於「C = D」(因爲.與換行符不匹配) ,

0

它不工作的方式....

如果你輸入的文字是:

"A = B = C\r\nW = X = Z" 

和你的表情是

"([^=]?) = ([^=]?) = ([^=]?)" 

那麼你會得到多個結果。請閱讀文檔! :-D

+0

有了這種類型的答案,鏈接將是有益的... – 2011-03-21 16:21:32

+0

看看這個:http://www.radsoftware.com.au/regexdesigner/它是一個很好的工具來設計和編輯正則表達式在C#中,並內置幫助。 – 2011-03-21 16:34:14

2

.*通常是貪婪的。這意味着它儘可能匹配儘可能多的字符,同時滿足表達式。因此,第一個.*與「A = B」匹配,第二個爲「C」。.*

您可以使用?表達後。 .*?將匹配儘可能少的字符,同時滿足表達式。

2

正則表達式以這樣的方式工作,即當找到匹配項時,已經匹配的輸入部分已被忽略。因此,當A = B已匹配時,該部分輸入將不會受到任何更多匹配。

0

*量詞是貪婪的。這使得第一表達.*比賽多字符越好,這樣,表達式將始終與(A = B) = (C).

使用不貪心量詞*?將匹配(A) = (B = C)

請嘗試使用它!