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?
CodePudding user response:
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%}
