如何使用正则表达式来验证递归语法定义?例如,假设我有以下语法:
阿尔法 := <beta> 伽马 | <阿尔法> <贝塔> beta := delta epsilon
这只是我所说的递归定义的一个例子——我不是在寻找一个专门解决这个问题的正则表达式,而是更多如何用正则表达式来解决这些问题。
这是在 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>