JavaScript正则表达式:使非贪婪化

4
我有一个正则表达式,它可以匹配包括换行符在内的任何字符:%{any charactering including new lines}%
/[%][{]\s*((.|\n|\r)*)\s*[}][%]/gm

如果我在字符串 "%{hey}%" 上测试正则表达式,它会返回 "hey" 作为匹配项。
但是,如果我给它 "%{hey}%%{there}%",它不会分别匹配 "hey" 和 "there",而是只有一个匹配项——"hey}%%{there"。
我该如何使其变得非贪婪,以便为每个 %{}% 返回一个匹配项?

正如我在正则表达式问题中经常提到的那样,请查看gSkinner的一个很酷的基于Flash的正则表达式工具Regexr,链接:http://www.gskinner.com/RegExr/。还有AS3正则表达式测试器:http://www.idsklijnsma.nl/regexps/。 - Moshe
3个回答

8
在星号后面加上一个问号。
/[%][{]\s*((.|\n|\r)*?)\s*[}][%]/gm

5
首先,要使通配符匹配非贪婪模式,只需在其后加上 ? (因此用 *? 代替 *,用 +? 代替 +)。
其次,您的模式可以通过多种方式简化。
/%\{\s*([\s\S]*?)\s*\}%/gm

不需要在方括号中放置单个字符。

最后,您想要捕获的中间表达式,您会注意到我放置了[\s\S]。这来自于JavaScript中匹配换行符,作为DOTALL行为的替代。


我确实看不出任何降低投票的理由。像Anton所做的那样简单地添加问号可能解决了即时问题,但这个答案更好。 - Alan Moore

1

更短更快的工作:

/%\{([^}]*)\}%/gm

这并不是很广泛。它简单快速,但不会涵盖像%{some}test}%这样的情况,而其他答案则会。无论这是好还是坏,取决于OP尚未指定的假设。 - cletus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接