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

vin*_*vin 21 javascript regex

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


这就是我所拥有的.

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

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

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

这就是我要的: cat


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

Dal*_*las 34

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

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

小提琴

另外,我想你可能想要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
Run Code Online (Sandbox Code Playgroud)

小提琴

  • 这将在没有任何非捕获的情况下工作,只需 `/model='(.*)'/g` 并在 `match[1]` 中匹配 (2认同)
  • 没错,通常没有理由创建非捕获组,除非你真的需要做一些需要组的事情 (2认同)

JLR*_*she 8

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

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

注意: 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);
Run Code Online (Sandbox Code Playgroud)