正则表达式:重复组只得到最后一组



我的数据:

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

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

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

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

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

(使用你的语言用来匹配所有的机制)。

您的组得到以下数字

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

按左括号编号。

如果现在第二次匹配这个表达式,那么来自捕获组的内容将被覆盖。

您正在重复捕获组。

据我所知,在。net中可以访问所有这些匹配,但在所有其他regex实现中,组内容被覆盖。

最新更新