正则表达式匹配除结束条件之外的所有条件

时间:2011-08-21 17:28:41

标签: regex

我正在尝试使用正则表达式匹配{{anything}}

 /\{\{.*\}\}/

但它不会在第一个}}结束,而是在文档的最后一个结束。

{{anything}} {{anotherthing}}

将返回整个块,而不是两个匹配。如何将这个表达式表达为不那么贪心?

我试着做

 /\{\{[^\}].*\}\}/

但它没有返回任何结果,

也是如此
/\{\{.*?\}\}/

奖金 - 没有拿到曲线,但只是字符串,我试过

 /\{\{(.*)\}\}/

更多失败(也返回空)。我怎样才能获得匹配的子集?

有一次,我的老师告诉我,她可以在15分钟内教我正则表达式。我从来没有上过这一课,我也不相信。 :)

3 个答案:

答案 0 :(得分:2)

您应该使用非贪婪的星来实现此目的(添加问号):

 /\{\{.*?\}\}/

您可以阅读有关此here

的更多信息

对于最后一部分,仅匹配没有大括号的字符串,请查看“lookbehind”和“lookahead”here

答案 1 :(得分:1)

在中间使用“not”运算符:

/\{\{[^\{\}]*\}\}/

即,在{{和}}内,你可以得到任何东西但是{或}。

如果你想捕获内部:

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

答案 2 :(得分:1)

如果你的正则表达式的味道不支持非贪婪的*?(它们是Perl中引入的新颖性,并且在“经典”正则表达式中不可用,例如grep,sed等)你必须做类似的事情

\{\{([^}]+|}[^}])*)\}\}

再次注意不同的正则表达式要求不同的反斜杠转义(例如,Linux中的sed会在大括号之前省略反斜杠,但在括号和交替运算符之前需要反斜杠,因此{{ 1}} - 还要注意加号重复运算符之前的反斜杠。

所以只是拼出来;文字{{\([^}]\+\|}[^}])*}}后面跟着一个字符序列,它们不是用大括号{{或者用文字大括号括起来,而是用另一个文字大括号[^}]来表达的,最后是结束文字双卷曲括号}[^}]