我知道StackOverflow已经完全涵盖了这个主题,但我不能为我的生活让我的正则表达式工作。所以没有进一步的重复... ...
这就是我所拥有的。
字符串:<p model='cat'></p>
正则表达式:.match(/(?:model=')(.*)(?:')/g)
这是我的表达式返回的内容:model='cat'
这就是我想要的:cat
为什么我的非捕获组不被忽略?难道我不明白非捕获组的作用是什么?为什么我的正则表达式不起作用?
答案 0 :(得分:33)
整个匹配将始终为组0,您需要访问该特定组(在这种情况下组1,因为第一组是非捕获组),您可以这样做:
var str = "<p model='cat'></p>";
var regex = /(?:model=')(.*)(?:')/g
var match = regex.exec(str);
alert(match[1]); // cat
另外,我想你可能想要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
答案 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);