我编写了以下regexp,以使用scan
方法匹配一组嵌套块中的所有最外层块。
input.scan(/[^{}]++\{((?:[^{}]+|\{\g<1>\})++)\}/)
或
input.scan(/[^{}]++\{(?<paren>(?:[^{}]+|\{\g<paren>\})++)\}/)
此代码的问题在于我用于?<paren>
组的括号导致scan
仅捕获?<paren>
组的内容,而我需要捕获匹配的整个字符串按scan
方法。我需要对这个问题做些什么?
答案 0 :(得分:3)
当存在捕获组时,扫描方法将仅返回这些捕获组的内容,但不会再返回整个匹配。
解决方案包括将整个模式放在捕获组中以解决问题。但是,每个结果将与捕获组1和2的内容串联起来。
为避免此问题,您只能使用一个捕获组重写模式,如下所示:
((?<={)(?:[^{}]+|{\g<1>})*+|[^{}\s][^{}]*{\g<1>})
编辑:或根本没有捕获组:
(?<={)(?:[^{}]+|{\g<0>})*+|[^{}\s][^{}]*{\g<0>}
备注:强> 在开始时的观察是为了检查你是否在递归。
使用 [^{}\s][^{}]*
代替[^{}]+
以避免前导空格和换行符。