Javascript 全局非捕获组的(简单?)正则表达式问题

Javascript 全局非捕获组的(简单?)正则表达式问题,javascript,regex,Javascript,Regex,假设我有字符串Hello{{name},你今天怎么样?我正试图从该字符串中获取name 到目前为止,我有/\{2}[a-z0-9]*\}{2}/gi。问题是,它抓取的是{{name},而不是name。如果没有全局标志,它可以正常工作,但我试图将每个单词的实例都放在双括号内,所以它不太正确。。。我不是正则表达式专业人士,所以我希望有人能帮我解决这个问题。最好的解决方案是使用lookaround断言,这样{和}就不会被发现,但是JavaScript正则表达式不支持lookbehind,它只支持loo

假设我有字符串
Hello{{name},你今天怎么样?
我正试图从该字符串中获取
name


到目前为止,我有
/\{2}[a-z0-9]*\}{2}/gi
。问题是,它抓取的是
{{name}
,而不是
name
。如果没有全局标志,它可以正常工作,但我试图将每个单词的实例都放在双括号内,所以它不太正确。。。我不是正则表达式专业人士,所以我希望有人能帮我解决这个问题。

最好的解决方案是使用lookaround断言,这样
{
}
就不会被发现,但是JavaScript正则表达式不支持lookbehind,它只支持lookahead

因此,另一种选择是将文本放在捕获组中,然后抓取其中的内容:

/\{{2}([a-z0-9]*)\}{2}/gi
要获取每个捕获,请使用regex创建一个
RegExp
对象,并遍历其
exec()
函数的结果。例如:

var str = 'Hello {{name}}, how are you doing {{date}}?';
var re = /\{{2}([a-z0-9]*)\}{2}/gi;
var words = [];
var match;

while (match = re.exec(str)) {
    words.push(match[1]);
}


或者,正如Gumbo在他的评论中所建议的那样,手动从匹配数组中去掉
{{
}

是的,如前所述,在2个大括号和2个大括号上进行模式匹配是一种方法(假设名称本身没有连续的2个大括号,无论是开始还是结束)

/\{{2}([a-z0-9]+)*\{2}/gi


这让我很惊讶,但正如OP所说的,由于/g标志,这不起作用。这基本上没什么区别。我猜这是因为javascript处理正则表达式的方式;在perl中,它可以正常工作。@crimson_penguin:您需要反复运行
RegExp.exec()
来获取所有捕获。@crimson_penguin:这没问题:
匹配.map(函数(val){return val.substring(2,val.length-2)}
。我接受这个答案,但就像@crimson_penguin说的那样,无论捕获组是什么,它都会返回它。。。我想我以后可以去掉这些值,但是如果用这种方法提取它们,而不是像@Gumbo推荐的那样迭代数组,那就容易多了。