全局非捕获组的(简单?)RegEx问题

时间:2011-01-20 15:07:41

标签: javascript regex

说我有字符串Hello {{name}}, how are you doing today?我正试图从该字符串中抓取name

到目前为止,我有/\{{2}[a-z0-9]*\}{2}/gi。问题是,它抓住了{{name}}而不是name。没有全局标志它工作正常,但我试图让双括号内的每个单词实例,所以它不太正确...我不是RegEx专业人士所以我希望有人可以帮助我...

2 个答案:

答案 0 :(得分:4)

最好的解决方案是使用外观断言,因此{{}}不会被拾取,但JavaScript正则表达式不支持lookbehind,它只支持前瞻。

因此,另一种方法是将文本放在捕获组中并抓住内部的内容:

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

要获取每次捕获,请使用正则表达式创建一个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]);
}

jsFiddle sample

或者正如Gumbo在评论中建议的那样,从您的匹配数组中手动​​删除{{}}

答案 1 :(得分:0)

如上所述,2个开始和结束括号上的模式匹配是要走的路(假设名称本身没有2个花括号,无论是打开/关闭)

  

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