次のような構文を使用する基本的なテキスト テンプレート エンジンがあります。
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)(?!))
しかし、これは私が期待するように完全に動作しているわけではありません。たとえば、多くの空のグループをキャプチャしています。ヘルプ?