2009-12-01 39 views
5

這是我第一次使用C#和使用正則表達式的有限經驗的一部分,我在捕獲特定表達式中第一次匹配時遇到了問題。我相信下面的例子會比描述我想要做的更清楚。用正則表達式捕獲第一個匹配(C#)

Match extractor = (new Regex(@".*\d(?<name>.*)\d.*")).Match("This hopefully will pick up 1Bob9error1 as a name"); 
     Console.WriteLine(extractor.Groups["name"]); 

我想這個表達式打印「鮑勃」,而不是「錯誤」。

我有一個預感它有什麼關係?在匹配組的前面,但我不完全確定什麼操作?在這種特殊情況下執行。一個解釋和一些幫助將是美好的。

謝謝你們,你們不知道這個網站能幫助像我這樣的初學程序員。

+0

(? yourRegEx)表示可以具有名稱「name」的捕獲組。這就是爲什麼你能夠使用extractor.Groups [「name」] – nickytonline 2009-12-01 21:19:35

回答

7

你的問題是貪婪。正則表達式的貪婪是。你的。*在開始時抓住了所有這些「這希望能拿起1Bob」。試試這個正則表達式代替:

\d(?<name>[^\d]+)\d 
+0

乍得,我建議你安裝RegExWorkbench,http://code.msdn.microsoft.com/RegexWorkbench。這是一個古老的項目,但由Eric Gunnerson製作。如果您沒有安裝.NET 1.x框架,他會提供源代碼,以便您可以使用您安裝的框架進行編譯。 – nickytonline 2009-12-01 21:26:56

+0

這真的拿起了「鮑勃」。真棒。我認爲我的問題是我對待這個正則表達式,就好像它必須匹配整個字符串,當時我真的只是問是否匹配。謝謝你一羣 – Chad 2009-12-01 21:27:30

+0

你必須記住,與正則表達式。 *可能非常邪惡。當你製作你的正則表達式時,你真的需要知道你想找到什麼,只有這個。這需要時間,但一旦你一直這樣做,你會以堅如磐石的正則表達式結束。我也推薦這個網站,http://www.regular-expressions.info,你讀過這本書,掌握正則表達式,http://regex.info。 – nickytonline 2009-12-01 21:30:19

3

匹配前面的元素零次或一次。它相當於{0,1}的 。 ?是一個 貪婪的量詞,其非貪婪當量是 ??。

摘自here。網站包含一個正則表達式的備忘單,看看你的表情,我似乎無法弄清楚它可能有什麼問題。

我的假設是它可能與您表達的最後一次匹配。

+0

我可能是錯的,但我不認爲呢?在這種情況下是量詞。量詞不是通常遵循一個表達式嗎? – Chad 2009-12-01 21:22:55

+0

這個表達沒有什麼錯,他只是看着它捕獲的第二個值,而不是第一個值。 – Rory 2009-12-01 21:23:01

+0

@查德?在此上下文中指示已命名組(更具體而言是名爲「name」的組)的開始。在大多數其他地方,它被用作量詞。 – Rory 2009-12-01 21:25:05

2

每個組項目有一個捕獲集合,可以訪問第一個捕獲使用一組:

extractor.Groups["name"].Captures[0] 
+0

P.S.每個Capture項目都有一個Value屬性,它返回捕獲的實際字符串值,還有一些其他有用的屬性,如捕獲以原始字符串開始的索引和捕獲的長度。如有疑問,請點擊F1。 – Rory 2009-12-01 21:21:37

+0

嗯...有用的信息,但捕捉[0]仍然會出現「錯誤」 正則表達式有什麼問題嗎? – Chad 2009-12-01 21:21:44

2

你的表達式包圍*字符造成你的麻煩。請記住,您不需要一個正則表達式,它與整個字符串相匹配 - 您只希望它在出現時僅匹配特定模式。以下代碼的工作原理如下:

Regex pattern = new Regex(@"\d(?<name>.*?)\d"); 
MatchCollection matches = pattern.Matches("This hopefully will pick up 1Bob9error1 as a name"); 
Console.WriteLine(matches[0].Groups["name"]); 
相關問題