0

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

   阿尔法 := <beta> 伽马 | <阿尔法> <贝塔>
   beta := delta epsilon

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

4

1 回答 1

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>
于 2013-10-14T18:53:16.670 回答