用于递归语法定义的Ruby正则表达式?

时间:2013-10-14 16:07:42

标签: ruby regex

如何使用正则表达式验证递归语法定义?例如,假设我有以下语法:

   alpha := <beta> gamma | <alpha> <beta>
   beta  := delta epsilon

这只是递归定义的一个例子 - 我不是在寻找专门解决这个问题的正则表达式,而是更多如何使用正则表达式处理这些问题。

1 个答案:

答案 0 :(得分:1)

这是一种匹配Ruby 1.9中的递归模式的方法,在这种情况下是一个任意级别的嵌套大括号:

#!/usr/bin/env ruby

text = "... { a { b { c } b } a { d } a } ...";
match = text.match(/(?<entire>\{(?:[^{}]+|\g<entire>)*\})/).captures
puts match

将打印:

{ a { b { c } b } a { d } a }

快速分解模式:

(?<entire>        # start named capture group called <entire>
  \{              #   match the literal '{'
  (?:             #   start non capture group 1
    [^{}]+        #     match one or more chars other than '{' and '}'
    |             #     OR
    \g<entire>    #     recursively match named group <entire>
  )*              #   end non capture group 1 and repeat it zero or more times
  \}              #   match the literal '}'
)                 # end named capture group called <entire>