6

次の文字列があります。

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 で同じ種類のエラーが発生します。

私の正規表現 foo は今日ほとんど使い果たされています。

4

1 に答える 1

16

Ruby は再帰に別の構文を使用します: \g<1>replaces (?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"]]
于 2013-10-21T06:23:58.040 に答える