I have a basic text template engine that uses a syntax like this:
foo bar
%IF MY_VAR
some text
%IF OTHER_VAR
some other text
%ENDIF
%ENDIF
bar foo
I have an issue with the regular expression that I am using to parse it whereby it is not taking into account the nested IF/ENDIF blocks.
The current regex I'm using is: %IF (?<Name>[\w_]+)(?<Contents>.*?)%ENDIF
I have been reading up on balancing capture groups (a feature of .NET's regex library) as I understand this is the recommended way of supporting "recursive" regex's in .NET.
I've been playing with balancing groups and have so far came up with the following:
(
(
(?'Open'%IF\s(?<Name>[\w_]+))
(?<Contents>.*?)
)+
(
(?'Close-Open'%ENDIF)(?<Remainder>.*?)
)+
)*
(?(Open)(?!))
But this is not behaving entirely how I would expect. It is for instance capturing a lot of empty groups. Help?