Ruby正则表达式中递归嵌套匹配的花括号对

时间:2013-10-21 05:13:55

标签: ruby regex

我有以下字符串:

The {quick} brown fox {jumps {over {deep} the} {sfsdf0} lazy} dog {sdfsdf1 {sdfsdf2}

PHP正则表达式:

/(?=\{((?:[^{}]+|\{(?1)\})+)\})/g

它产生以下匹配:

[5-10]  `quick`
[23-60] `jumps {over {deep} the} {sfsdf} lazy`
[30-45] `over {deep} the`
[36-40] `deep`
[48-54] `sfsdf0`
[76-83] `sdfsdf2`

请参阅:http://regex101.com/r/fD3iZ2

我正在尝试使用Ruby中的等效工具,但我遇到(?1)的问题...导致undefined group option错误:

str = "The {quick} brown fox {jumps {over {deep} the} {sfsdf} lazy} dog {sdfsdf {sdfsdf}"
str.scan /(?=\{((?:[^{}]+|\{(?1)\})+)\})/

SyntaxError: undefined group option: /(?=\{((?:[^{}]+|\{(?1)\})+)\})/

请参阅:http://fiddle.re/n6w4n

巧合的是,我在Javascript和Python中遇到了同样的错误。

我的正则表达式今天几乎已经筋疲力尽了,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:15)

Ruby使用不同的语法进行递归:\g<1>替换(?1)。所以试试

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

我还使量词具有占有率,以避免在不平衡的情况下出现过度回溯。

irb(main):003:0> result = str.scan(/(?=\{((?:[^{}]++|\{\g<1>\})++)\})/)
=> [["quick"], ["jumps {over {deep} the} {sfsdf} lazy"], ["over {deep} the"], 
["deep"], ["sfsdf"], ["sdfsdf"]]