单线(DOTALL)正则表达式匹配超过我想要的

时间:2014-06-12 20:49:42

标签: java regex

我在使用单行正则表达式时遇到了一些问题(或者是针对Java人员的DOTALL)。 我想在文档上匹配这些set指令中的每一个。 我的正则表达式就是这个:

\{\%\s*set\s+(\S+)\s*\%\}.+\{\%\s*endset\s*\%\}

我要匹配的目标内容如下所示:

{% set var1 %}
  some multiline 
  really long content
{% endset %}

<other random code>

{% set var2 %}
  some multiline 
  other really long content
{% endset %}

此正则表达式的问题在于,第一个匹配(仅在整个文档中)从{%set var1%}开始,并从第二个代码块的{%endset%}结束。 我尝试使用lookahead和lookbehind没有结果。

有什么建议吗?

谢谢,

1 个答案:

答案 0 :(得分:7)

您需要.+?关注 non-greedy 匹配。

\{%\s*set\s+(\S+)\s*%\}.+?\{%\s*endset\s*%\}
                         ^

注意:您无需转义%,因为它不被视为特殊含义的字符。

Live Demo