2011-01-20 49 views
2

说我有字符串Hello {{name}}, how are you doing today?我试图从该字符串抓name。我们有/\{{2}[a-z0-9]*\}{2}/gi。问题是,它抓住{{name}}而不是name。没有全局标志,它工作正常,但我试图让每个单词的实例在双括号内,所以它不是很正确......我不是正则表达式专家,所以我希望有人能帮助我... ...一个(简单的?)RegEx问题的全球非捕获组

回答

4

最好的解决方案是使用lookaround断言,以便{{}}不会被拾取,但JavaScript正则表达式不支持倒序,它只支持lookahead。

那么一个选择是你的文字放在一个捕获组,并抓住里面是什么:

/\{{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

或者像浓汤建议在他的评论,手动从比赛的阵列剥离出{{}}

+2

令人惊讶的对我,但是这并不工作,因为OP说,因为/ g标志的。它基本上没有区别。我想这是因为JavaScript如何处理正则表达式;在Perl中它会正常工作。 – 2011-01-20 15:21:47

0

是啊如所提到的,模式匹配对2开闭括号是要走的途径(假设名字不具有内本身在2号的连续的大括号,无论是开/关)

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