我有一个基本的文本模板引擎,它使用如下语法:
foo bar
%IF MY_VAR
some text
%IF OTHER_VAR
some other text
%ENDIF
%ENDIF
bar foo
我用于解析它的正则表达式存在问题,它没有考虑嵌套的 IF/ENDIF 块。
我正在使用的当前正则表达式是:%IF (?<Name>[\w_]+)(?<Contents>.*?)%ENDIF
我一直在阅读平衡捕获组(.NET 正则表达式库的一项功能),因为我知道这是在 .NET 中支持“递归”正则表达式的推荐方式。
我一直在玩平衡组,到目前为止,我想出了以下几点:
(
(
(?'Open'%IF\s(?<Name>[\w_]+))
(?<Contents>.*?)
)+
(
(?'Close-Open'%ENDIF)(?<Remainder>.*?)
)+
)*
(?(Open)(?!))
但这并不完全符合我的预期。例如,它捕获了很多空组。帮助?