不捕获ruby中的命名组

时间:2014-11-13 15:47:09

标签: ruby regex

我编写了以下regexp,以使用scan方法匹配一组嵌套块中的所有最外层块。

input.scan(/[^{}]++\{((?:[^{}]+|\{\g<1>\})++)\}/)

input.scan(/[^{}]++\{(?<paren>(?:[^{}]+|\{\g<paren>\})++)\}/)

此代码的问题在于我用于?<paren>组的括号导致scan仅捕获?<paren>组的内容,而我需要捕获匹配的整个字符串按scan方法。我需要对这个问题做些什么?

1 个答案:

答案 0 :(得分:3)

当存在捕获组时,扫描方法将仅返回这些捕获组的内容,但不会再返回整个匹配。

解决方案包括将整个模式放在捕获组中以解决问题。但是,每个结果将与捕获组1和2的内容串联起来。

为避免此问题,您只能使用一个捕获组重写模式,如下所示:

((?<={)(?:[^{}]+|{\g<1>})*+|[^{}\s][^{}]*{\g<1>})

online demo

编辑:或根本没有捕获组:

(?<={)(?:[^{}]+|{\g<0>})*+|[^{}\s][^{}]*{\g<0>}

备注: 在开始时的观察是为了检查你是否在递归。

使用

[^{}\s][^{}]*代替[^{}]+以避免前导空格和换行符。