正则表达式:重复组仅获取最后一组

时间:2013-02-28 13:39:59

标签: regex

我的数据:

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:组合?

2 个答案:

答案 0 :(得分:3)

大多数正则表达式引擎不允许在重复组中使用同一组括号中的多个捕获。如果捕获括号不止一次匹配,则得到最后匹配的结果。

最简单的解决方法是仅为该子模式制作正则表达式,然后在每次匹配时获取结果。

换句话说,首先获取字符串的相关部分,然后在其上使用这样的正则表达式:

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

(使用您的语言用来匹配所有的任何机制。)

答案 1 :(得分:2)

您的论坛获得以下号码

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

它们用左括号编号。

如果此表达式现在第二次匹配,则覆盖捕获组的内容。

你是repeating a capturing group

正如我在.net中所知,可以访问所有这些匹配,但在所有其他正则表达式实现中,组内容将被覆盖。