正则表达式匹配仅适用于第一次捕获(JavaScript)

时间:2013-07-01 13:52:53

标签: regex

我有一个文件内容到内存中。在文件中,有以下形式的变量:

{{ _("variable1") }}
{{ _("variable2") }}
{{ _("variable3") }}

我试图用/\{\{ _(.+) \}\}/i抓住他们:

var result = /\{\{ _(.+) \}\}/i.exec(fileContents);

它似乎首先工作,因为前两个变量被推入数组,但随后它推送整个文件内容。

我错过了什么?

BONUS:如果我能抓住 variable1 而不是 {{_(“variable1”)}} ,那真是太棒了但我可以和它一起生活。

1 个答案:

答案 0 :(得分:2)

您需要的是g标志。这样,每次拨打exec时,您都会获得额外的匹配(直到没有其他匹配,并且您获得null)。对于奖励,只需在模式中包含(""),以便不会捕获它们。最后,您可能想要.+不合适,否则如果在一行中多次出现此模式,您会得到有趣的惊喜:

r = /\{\{ _\("(.+?)"\) \}\}/ig;
while(m = r.exec(fileContents)
{
    // m[0] will contain the entire match
    // m[1] will contain the contents of the quotes
}

顺便说一下,如果"variable1"不能包含转义引号(例如"some\"oddvariable"),那么此正则表达式应该稍微提高效率:

r = /\{\{ _\("([^"]*)"\) \}\}/ig