33

我知道这个主题已经在 StackOverflow 上进行了全面介绍,但我一辈子都无法让我的正则表达式正常工作。因此,无需进一步重复...


这就是我所拥有的。

细绳:<p model='cat'></p>

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

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

这就是我要的:cat


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

4

2 回答 2

47

整个比赛将始终是第 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

小提琴

于 2013-08-12T02:03:40.383 回答
10

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

看起来您实际上正在寻找的是“匹配前缀但排除”组(?<=)和“匹配后缀但排除”组(?=)

注意: 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);

于 2020-05-26T10:30:19.070 回答