I am currently working on a simple template engine. In a template, if-statements can be used. An if block looks like this
{% name IF: a EQUALS b %}
content
{% name ENDIF %}
I want to identify these blocks via regex.
The Problem is I need a regex pattern which contains two unknown but equal parts.
This is the pattern which matches to all blocks:
/{% +(.*) +IF: +(.*) +%}([\s\S]*){% +(.*) +ENDIF +%}/gm
To make it clarify which ENDIF marker belongs to which IF the first and the last capture group needs to be the same.
Is there a way to do this?
>Solution :
You may use this regex:
{%\s+(\S+)\s+IF:[^}]+%}(?s)(.+?){%\s+\1\s+ENDIF\s+%}
RegEx Details:
{%: Match{%\s+: Match 1+ whitespaces(\S+):\s+: Match 1+ whitespacesIF:: MatchIF:[^}]+: Match 1+ of any character that is not a}%}: Match%}(?s): Enable DOTALL mode so that dot matches line break(.+?): 1st capture group to match 1+ of any characters{%: Match{%\s+: Match 1+ whitespaces\1: Match same value as what we captured in capture group #1\s+: Match 1+ whitespacesENDIF: MatchENDIF\s+: Match 1+ whitespaces%}: Match closing%}