如何检索JavaScript中的正则expression式的所有匹配?

我是新的正则expression式。 我试图parsing以下types的string:

[key:"val" key2:"val2"]

里面有任意键:“val”对。 我想抓住关键的名字和价值。 对于那些好奇的我试图parsing任务战士的数据库格式。 这是我的testingstring:

[description:"aoeu" uuid:"123sth"]这是为了强调任何东西都可以在空格之外的键或值,冒号周围没有空格,值总是用双引号。 在节点中,这是我的输出:

 [deuteronomy][gatlin][~]$ node > var re = /^\[(?:(.+?):"(.+?)"\s*)+\]$/g > re.exec('[description:"aoeu" uuid:"123sth"]'); [ '[description:"aoeu" uuid:"123sth"]', 'uuid', '123sth', index: 0, input: '[description:"aoeu" uuid:"123sth"]' ] 

但是description:"aoeu"也匹配这个模式。 我怎样才能让所有的比赛回来?

继续在循环中调用re.exec(s)以获取所有匹配项:

 var re = /\s*([^[:]+):\"([^"]+)"/g; var s = '[description:"aoeu" uuid:"123sth"]'; var m; do { m = re.exec(s); if (m) { console.log(m[1], m[2]); } } while (m); 

试试这个jsfiddle: http : //jsfiddle.net/7yS2V/

要遍历所有匹配,可以使用replace函数:

 var re = /\s*([^[:]+):\"([^"]+)"/g; var s = '[description:"aoeu" uuid:"123sth"]'; s.replace(re, function(match, g1, g2) { console.log(g1, g2); }); 

这是一个解决scheme

 var s = '[description:"aoeu" uuid:"123sth"]'; var re = /\s*([^[:]+):\"([^"]+)"/g; var m; while (m = re.exec(s)) { console.log(m[1], m[2]); } 

这是基于lawnsea的答案,但更短。

请注意,必须设置“g”标志,以跨越调用向前移动内部指针。

str.match(pattern)将返回所有匹配的数组。 我想这是最简单的方法。

例如 –

 "All of us except @Emran, @Raju and @Noman was there".match(/@\w*/g) // Will return ["@Emran", "@Raju", "@Noman"] 

基于Agus的function,但我更喜欢只返回匹配值:

 var bob = "> bob <"; function matchAll(str, regex) { var res = []; var m; if (regex.global) { while (m = regex.exec(str)) { res.push(m[1]); } } else { if (m = regex.exec(str)) { res.push(m[1]); } } return res; } var Amatch = matchAll(bob, /(&.*?;)/g); console.log(Amatch); // yeilds: [>, <] 

这是我的function来获得匹配:

 function getAllMatches(regex, text) { if (regex.constructor !== RegExp) { throw new Error('not RegExp'); } var res = []; var match = null; if (regex.global) { while (match = regex.exec(text)) { res.push(match); } } else { if (match = regex.exec(text)) { res.push(match); } } return res; } var regex = /abc|def|ghi/g; var res = getAllMatches(regex, 'abcdefghi'); res.forEach(function (item) { console.log(item[0]); }); 

这是我的答案:

 var str = '[me nombre es] : My name is. [Yo puedo] is the right word'; var reg = /\[(.*?)\]/g; var a = str.match(reg); a = a.toString().replace(/[\[\]]/g, "").split(','));