正则表达式与反向引用的递归匹配

时间:2015-03-18 19:52:09

标签: regex

我有以下正则表达式

\s([^:]*)\s?r?:([0-9]+)(?=.*\1:-([0-9]*)) 

匹配像

这样的字符串
start x.foo:100 aa x.foo:101 aa y.bar r:300 aa y.bar:-600 aa x.foo:-202 aa x.foo:-200 z.zoo:250 z.zoo:-500 end 

我希望在匹配中给出内部x.foo:101和内部x.foo:-202 和外部的x.foo:100 anf x.foo:-200是另一场比赛

你能不能帮助改变正则表达式来实现这个目标

1 个答案:

答案 0 :(得分:0)

我认为不能用一个简单的模式完成,所以我建议在循环中使用这个模式 - 取决于你的编程语言

.*?((\S+):\d+)(.*)(\2:-\d+)|.+$

并根据您的引擎替换w / $3\3,您要寻找的是子模式1& 4

MATCH 1
1.  [6-15]  `x.foo:100`
2.  [6-11]  `x.foo`
3.  [15-75] ` aa x.foo:101 aa y.bar r:300 aa y.bar:-600 aa x.foo:-202 aa `
4.  [75-85] `x.foo:-200`
MATCH 2
1.  [86-95] `z.zoo:250`
2.  [86-91] `z.zoo`
3.  [95-96] ` `
4.  [96-106]    `z.zoo:-500`

替换结果将如下所示:

` aa x.foo:101 aa y.bar r:300 aa y.bar:-600 aa x.foo:-202 aa  `

现在使用结果上的相同模式运行循环将为您提供

MATCH 1
1.  [4-13]  `x.foo:101`
2.  [4-9]   `x.foo`
3.  [13-46] ` aa y.bar r:300 aa y.bar:-600 aa `
4.  [46-56] `x.foo:-202`

等等,请记住只使用子模式1和4,并在没有更多匹配时打破循环。

Demo