2013-04-22 48 views
1

我現在的正則表達式如下:正則表達式搶到第二個參數組

(?<token>#gallery (?<id>[^#]+)#) 

我使用它來抓住一些信息。

#gallery d23d23d#

的情況下,將greab d23d23d爲名爲Id的D組。

我需要擴展,以允許更多的參數,這樣我可以抓住

#gallery d23d23d foo#並獲得d23d23dfoo作爲單獨的羣體?

我的正則表達式技能是無望的一些幫助,將不勝感激。

謝謝。

回答

0

如果你想捕捉精彩兩組使用:

(?<token>#gallery\s+(?<id>[^\s#]+)\s+(?<foo>[^\s#]+)#) 

foo將包含第二個捕獲組。請注意,使用\s來計算空間以外的空白字符,並在組之間使用\s+以允許參數之間有多個空白字符。

爲了捕捉零,一,兩組使用:

(?<token>#gallery(?:\s+(?<p1>[^\s#]+)(?:\s+(?<p2>[^\s#]+)(?:\s+(?<p3>[^\s#]+))?)?)?#) 

在組p1p2p3將包含第一組,當他們出現,他們不需要爲token相匹配。

捕捉到任何數量的羣體(包括無)的使用

(?<token>#gallery(?:\s+(?<id>[^\s#]+))*#) 

雖然組idValue將只包含最後匹配的參數,它是Captures屬性將包含所有其它參數。

+0

http://gskinner.com/RegExr第一個測試不再只是捕獲一個組,第二個只是抓住所有附加作爲一個組... – shenku 2013-04-22 23:16:47

+0

嗯幾乎在那裏,有沒有辦法使用第三個選項'(? #gallery(?:(? [^#] +))*#)'但是空格之間的每個值都在一個單獨的組中? – shenku 2013-04-23 01:31:30

+0

@shenku你不能把它們放在一個單獨的組中,也不要爲它們明確地創建單獨的組,但是然後你僅限於你指定的組數。我想你可以按照我的第二種模式定義一個任意數量的組作爲指導:'(?#gallery(? [^#] +)(?:(? [^#] +)(?: (? [^#] +)(?:(? [^#] +))?)?)?#)'將會匹配1到4個參數,但正如您所看到的,這非常快速地失控。 – 2013-04-23 01:38:12