2010-02-15 72 views
2

我有這樣的正則表達式看起來對%{any charactering including new lines}%JavaScript的正則表達式:請ungreedy

/[%][{]\s*((.|\n|\r)*)\s*[}][%]/gm 

如果我測試的,如「%{哎}%」的字符串的正則表達式,正則表達式返回「哎」的比賽。

但是,如果我給它「%{hey} %% {there}%」,它不會同時匹配「hey」和「there」,它有一個匹配—「hey} %% {there 」。

我該如何使其不符合要求,以便爲每個%{}%返回一個匹配項?

+0

我經常提到的正則表達式的問題,檢查出Regexr,涼爽的基於閃存的正則表達式的工具,通過gSkinner鏈接:http://www.gskinner.com/RegExr /還有AS3正則表達式測試程序:http://www.idsklijnsma.nl/regexps/ – Moshe

回答

4

在星號後面加一個問號。

/[%][{]\s*((.|\n|\r)*?)\s*[}][%]/gm 
3

首先,做一個通配符匹配非貪婪,只是?(所以*?,而不是*+?代替+)追加它。其次,您的模式可以通過多種方式進行簡化。

/%\{\s*([\s\S]*?)\s*\}%/gm 

沒有必要在方括號中放置單個字符。

最後你想捕捉中間的表情,你會注意到我把[\s\S]。這來自Matching newlines in JavaScript作爲DOTALL行爲的替代。

+0

這是downvoted的任何特定原因? – cletus

+0

*我*當然沒有看到任何downvote的原因。簡單地添加問號如Anton所做的那樣可能解決了當前的問題,但是這個答案要好得多。 –

1

更短,更快的工作:

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

謝謝,我希望我可以upvote! – JamesBrownIsDead

+0

這不是那麼廣泛。它簡單而快速,但不會涵蓋像其他答案將會出現的'%{some} test}%'這樣的情況。然而,這是好還是壞,取決於OP尚未指定的假設。 – cletus