如何使用正则表达式验证递归语法定义?例如,假设我有以下语法:
alpha := <beta> gamma | <alpha> <beta> beta := delta epsilon
这只是递归定义的一个例子 - 我不是在寻找专门解决这个问题的正则表达式,而是更多如何使用正则表达式处理这些问题。
答案 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>