JavaScript正则表达式:make ungreedy

Jam*_*ead 2 javascript regex

我有这个正则表达式寻找%{any charactering including new lines}%:

/[%][{]\s*((.|\n|\r)*)\s*[}][%]/gm
Run Code Online (Sandbox Code Playgroud)

如果我测试的,如"%{}哎%"的字符串正则表达式,正则表达式返回"哎"的比赛.

但是,如果我给它"%{hey} %% {there}%",它与"嘿"和"那里"分别不匹配,它有一个匹配 - "嘿} %% {那里".

如何使其不合适,以便为每个%{}%返回一个匹配项?

Ant*_*son 5

在明星之后添加问号.

/[%][{]\s*((.|\n|\r)*?)\s*[}][%]/gm
Run Code Online (Sandbox Code Playgroud)


cle*_*tus 5

首先,要使通配符匹配非贪婪,只需在其后面附加?(so*?而不是*+?而不是+)。

其次,您的模式可以通过多种方式简化。

/%\{\s*([\s\S]*?)\s*\}%/gm
Run Code Online (Sandbox Code Playgroud)

无需将单个字符放在方括号中。

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