正则表达式使匹配不那么贪婪

时间:2015-03-04 21:21:38

标签: javascript regex

我有以下字符串:

<h2><!--DEL-->This is the title<!-- /DEL --><!-- ADD--><% title %><!--/ADD--></h2>

<!--ADD-->
<strong>some emphasised text</strong>
<!--/ADD-->

<ul>
    <!--ADD--><% for each item in list %>   <!--/ADD--> <li><!--DEL-->This is the first item in the list<!--/DEL--><!--ADD--><% item %><!--/ADD--></li><!--ADD--><% end for %><!--  /ADD -->
    <!--DEL--><li>This is the second item in the list</li><!--/DEL -->
    <!--DEL--><li>This is the <strong>third</strong> item in the list</li><!-- /DEL    -->
</ul>

通过正则表达式,我希望它产生以下内容:

<h2><% title %></h2>

<strong>some emphasised text</strong>

<ul>
    <% for each item in list %><li><% item %></li><% end for %>
</ul>

我正在使用的正则表达式:

template = template.replace(/<\!--\s*?DEL\s*?-->(.*)<\!--\s*?\/DEL\s*?-->/gm, "");
template = template.replace(/<\!--\s*?ADD\s*?-->(.*)<\!--\s*?\/ADD\s*?-->/gm, "$1");

但目前正在制作:

<h2><% title %></h2>
<ul>
  <% for each item in list %><!-- /ADD --><li><!-- ADD --><% item %><!-- /ADD --></li><!-- ADD --><% end for %>
</ul>

问题1:当同一行上有多个匹配时,它似乎不喜欢它(似乎将它们视为一个大匹配)。

问题2:如何让它跨多线匹配?我知道。字符不允许换行符,但我使用的是/ m修饰符(似乎不起作用)。

任何想法都将不胜感激!

感谢。

2 个答案:

答案 0 :(得分:1)

问题1

你只需要让你的通配符懒惰:

template = template.replace(/<\!--\s*?DEL\s*?-->(.*?)<\!--\s*?\/DEL\s*?-->/gm, "");
template = template.replace(/<\!--\s*?ADD\s*?-->(.*?)<\!--\s*?\/ADD\s*?-->/gm, "$1");

答案 1 :(得分:1)

问题2. js中没有DOT_ALL修改器。但是使用可以使用构造[\ s \ S]而不是实际匹配所有符号的点。 所以最后你的regexp将是

/<\!--\s*?DEL\s*?-->([\s\S]*?)<\!--\s*?\/DEL\s*?-->/gm