非捕获组仍然在比赛中显示

时间:2013-08-12 01:59:45

标签: javascript regex

我知道StackOverflow已经完全涵盖了这个主题,但我不能为我的生活让我的正则表达式工作。所以没有进一步的重复... ...


这就是我所拥有的。

字符串:<p model='cat'></p>

正则表达式:.match(/(?:model=')(.*)(?:')/g)

这是我的表达式返回的内容:model='cat'

这就是我想要的:cat


为什么我的非捕获组不被忽略?难道我不明白非捕获组的作用是什么?为什么我的正则表达式不起作用?

2 个答案:

答案 0 :(得分:33)

整个匹配将始终为组0,您需要访问该特定组(在这种情况下组1,因为第一组是非捕获组),您可以这样做:

var str = "<p model='cat'></p>";
var regex = /(?:model=')(.*)(?:')/g
var match = regex.exec(str);
alert(match[1]);  // cat

Fiddle

另外,我想你可能想要str中的几个匹配,你可以这样做:

var str = "<p model='cat'></p><p model='dog'></p><p model='horse'></p>";
var regex = /(?:model=')([^']*)/g
var matches = [];
var match;
while (match = regex.exec(str)) {
    matches.push(match[1]);
}
alert(matches); // cat,dog,horse

Fiddle

答案 1 :(得分:6)

一个非捕获组基本上只是一个非组-一种使用括号而不实际将模式的那一部分视为一个组的方法。

您实际上正在寻找的是“匹配前缀但不包括”组(?<=)和“匹配后缀但不包括”组(?=)

注意:Internet Explorer中似乎不支持这种类型的组。

如果使用这些,您将获得所需的结果:

var str = "<p model='cat'></p><p model='dog'></p><p model='horse'></p>";
var regex = /(?<=model=')[^']*(?=')/g
var matches = str.match(regex);

console.log(matches);