我有这个正则表达式,它查找%{any charactering including new lines}%
:
/[%][{]\s*((.|\n|\r)*)\s*[}][%]/gm
如果我在像“%{hey}%”这样的字符串上测试正则表达式,正则表达式会返回“hey”作为匹配。
但是,如果我给它“%{hey} %% {there}%”,它与“嘿”和“那里”分别不匹配,它有一个匹配 - “嘿} %% {那里”
如何使其不合适,以便为每个%{}%返回一个匹配项?
答案 0 :(得分:5)
在明星之后添加问号。
/[%][{]\s*((.|\n|\r)*?)\s*[}][%]/gm
答案 1 :(得分:3)
首先,要使通配符匹配非贪婪,只需将其附加?
(*?
代替*
和+?
而不是+
)。
其次,您的模式可以通过多种方式进行简化。
/%\{\s*([\s\S]*?)\s*\}%/gm
无需在方括号中放置单个字符。
最后在你要捕捉的中间表达,你会注意到我放了[\s\S]
。这来自Matching newlines in JavaScript,可替代DOTALL
行为。
答案 2 :(得分:1)
工作更短,更快:
/%\{([^}]*)\}%/gm