平衡正则表达式
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
所以我开始使用正则表达式并尝试匹配以下文本的 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