2013-02-28 98 views
3

我的數據:正則表達式:重複組只獲得了最後一組

stack: 123 overflow: 456 others: - st: 7 ov: 7 againothers: - m: 11 t: 12 - m: 13 t: 14 - m: 15 t: 16 - st: 8 ov: 8 againothers: - m: 17 t: 18 end: 42 

我的正則表達式:

^stack: (\d+) overflow: (\d+) others: ?(.+) end: (\d+)$ 

的組相匹配的:到目前爲止

1: 123 
2: 456 
3: - st: 7 ov: 7 againothers: - m: 11 t: 12 - m: 13 t: 14 - m: 15 t: 16 - st: 8 ov: 8 againothers: - m: 17 t: 18 
4: 42 

好。在第3組,然後運行下面的正則表達式:

^(?:- st: (\d+) ov: (\d+) againothers: ?(?: - m: (\d+) t: (\d+))+)+$ 

不工作的所有(爲什麼?),所以我刪除^$和它匹配。隨後的比賽看起來是這樣的:

1: 7  // <-- Works as expected. 
2: 7 
3: 15 // <-- Here I'd expected 2 groups matching: (13,14), (15,16) 
4: 16 // <-- but I'm only getting the last group. 
1: 8  // <-- This works and the remainder is as expected. 
2: 8 
3: 17 
4: 18 

我似乎缺少「13,14」相匹配的一個或多個(?: - m: (\d+) t: (\d+))+組合我內心的組。

在線測試:http://gskinner.com/RegExr/?33urf,萬一得到屠殺,我的數據有:- st: 7 ov: 7 againothers: - m: 11 t: 12 - m: 13 t: 14 - m: 15 t: 16 - st: 8 ov: 8 againothers: - m: 17 t: 18和正則表達式是:(?:- st: (\d+) ov: (\d+) againothers: ?(?: - m: (\d+) t: (\d+))+)+。我看過http://www.regular-expressions.info/captureall.html,我認爲我的問題與此有關?任何提示/指針/幫助,以便我可以匹配一個或多個m:t:組合?

+0

你必須更深入! – 2013-02-28 15:53:55

回答

2

大多數正則表達式引擎不允許從重複組中的同一組括號進行多次捕獲。如果捕獲括號不止一次匹配,則會得到最後匹配的結果。

最簡單的解決方法是僅爲該子模式創建正則表達式,然後從每次匹配時獲取結果。

換句話說,首先得到的字符串相關的部分,然後用這樣的正則表達式就可以了:

/ - m: (\d+) t: (\d+)/ 

(使用任何機制語言用於匹配所有)。

2

你的羣體得到以下數字

^(?:- st: (\d+) ov: (\d+) againothers: ?(?: - m: (\d+) t: (\d+))+)+$ 
      1   2       3  4 

它們通過打開支架編號。

如果此表達式現在第二次匹配,則來自捕獲組的內容將被覆蓋。

你是repeating a capturing group

正如我在.net中所知,可以訪問所有這些匹配,但是在所有其他正則表達式實現中,組內容將被覆蓋。