平衡的正则表达式

时间:2015-01-16 23:47:15

标签: regex tokenize lexer

所以我抓住正则表达式,尝试使用正则表达式匹配以下文本的外部 {% tag xyz %}{% endtag %} 标记

{% tag xyz %}
   {% tag abc %}
   {% endtag %}
{% endtag %}

我的正则表达式如下所示并且到目前为止有效:

({%)\s*(tag)([^%}]*?)(?:\s*(?:(%})((?:(?:[^{%]*?)|(?R))*)(?:({%)\s*(end\2)\s*(%}))))

但是,只要匹配标记内的文本包含单个{%符号,正则表达式就无法按预期工作。我认为这是因为字符类可以匹配{%而且{%也可以作为单个字符。我尝试了很多并最终尝试和错误,但没有成功。

有关该问题的任何帮助吗?

我为您设置了两个regex101链接以显示问题:

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

尝试将[^{%]替换为(?:(?!{%).)并添加s(PCRE_DOTALL)flag

通过使用否定lookahead,这将允许{之间没有%

测试your updated pattern或其他人开始尝试:

/{% tag \w+ %}(?:(?:(?!{%).)|(?0))*{% endtag %}/gs

test at regex101