我正在尝试使用正则表达式匹配{{anything}}
/\{\{.*\}\}/
但它不会在第一个}}
结束,而是在文档的最后一个结束。
{{anything}} {{anotherthing}}
将返回整个块,而不是两个匹配。如何将这个表达式表达为不那么贪心?
我试着做
/\{\{[^\}].*\}\}/
但它没有返回任何结果,
也是如此/\{\{.*?\}\}/
奖金 - 没有拿到曲线,但只是字符串,我试过
/\{\{(.*)\}\}/
更多失败(也返回空)。我怎样才能获得匹配的子集?
有一次,我的老师告诉我,她可以在15分钟内教我正则表达式。我从来没有上过这一课,我也不相信。 :)
答案 0 :(得分:2)
您应该使用非贪婪的星来实现此目的(添加问号):
/\{\{.*?\}\}/
您可以阅读有关此here
的更多信息对于最后一部分,仅匹配没有大括号的字符串,请查看“lookbehind”和“lookahead”here
答案 1 :(得分:1)
在中间使用“not”运算符:
/\{\{[^\{\}]*\}\}/
即,在{{和}}内,你可以得到任何东西但是{或}。
如果你想捕获内部:
/\{\{([^\{\}]*)\}\}/
答案 2 :(得分:1)
如果你的正则表达式的味道不支持非贪婪的*?
(它们是Perl中引入的新颖性,并且在“经典”正则表达式中不可用,例如grep,sed等)你必须做类似的事情
\{\{([^}]+|}[^}])*)\}\}
再次注意不同的正则表达式要求不同的反斜杠转义(例如,Linux中的sed
会在大括号之前省略反斜杠,但在括号和交替运算符之前需要反斜杠,因此{{ 1}} - 还要注意加号重复运算符之前的反斜杠。
所以只是拼出来;文字{{\([^}]\+\|}[^}])*}}
后面跟着一个字符序列,它们不是用大括号{{
或者用文字大括号括起来,而是用另一个文字大括号[^}]
来表达的,最后是结束文字双卷曲括号}[^}]
。