平衡正则表达式

Balanced regular expression

所以我开始使用正则表达式并尝试匹配以下文本的 outer {% tag xyz %}{% endtag %} tags正则表达式:

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

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

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

但是只要匹配标签内的文本包含单个 {% 符号,正则表达式就不会按预期工作。我认为这是因为字符 类 可能匹配 {% 但也可能匹配 {% 作为单个字符。我尝试了很多,最后都试错了,但没有成功。

对这个问题有帮助吗?

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

非常感谢任何帮助!

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

这将允许 { 后跟 % 之间使用负数 lookahead

测试 your updated pattern 或这里另一个开始尝试:

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

test at regex101