2015-09-14 195 views
0

試圖圍繞我的腦袋圍繞Regex capturing groups並且有點麻煩。C#正則表達式捕獲組

我有一些字符串,我想捕獲組爲:

@msg=hello;name=test 1 // Groups: msg = hello, name = test, rest = 1 
@msg=hi 2 // Groups: msg = hello, name = null, rest = 2 
@name=tt 3 // Groups: msg = null, name = tt, rest = 3 

我有以下regex

msg=(?P<msg>[^;]+)?.*name=(?P<name>[^;]+)?\s(?P<rest>.*) 

其中第一行,而不是第二工作正常或第三個。任何想法我怎麼能使它爲他們工作呢?我試圖把各地捕獲組一些()?無濟於事:

// Below gets me weird results 
(msg=(?P<msg>[^;]+)?)?.*(name=(?P<name>[^;]+)?)?\s((?P<rest>.*))? 

感謝。

+0

有一些偉大的正則表達式的測試,在那裏,應該能夠幫助你。玩regexr.com直到你找到你要找的東西,你可以學到很多,而這樣做:) –

回答

1

你應該用更嚴格的令牌,而不是否定,使用可選的非捕獲組:

@(?:msg=(?<msg>\w+);?)?(?:name=(?<name>\w+))?\s*(?<rest>.*) 

Regex Demo

+0

完美,謝謝:) –

+1

我非常堅定的正則表達式,但我沒有看到構造'( ?(P <'對於C#之前的命名組,'?(P '和'(?'?[Msdn](https://msdn.microsoft.com/en-us/library/az24scfc v = vs.110).aspx)不知道這種模式。Btw:這種模式在C#中不起作用。我們真的在談論C#嗎? –

+0

對不起,它的目的是之前減少,但它保存後原來的命名組。 – hwnd