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

Posted

技术标签:

【中文标题】非捕获组仍然显示在比赛中【英文标题】:non-capture group still showing in match 【发布时间】:2013-08-12 01:59:44 【问题描述】:

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


这就是我所拥有的。

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

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

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

这就是我想要的:cat


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

【问题讨论】:

【参考方案1】:

整个比赛总是第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

【讨论】:

奇怪 .. 几乎就像你可以看到我输入的内容 .. 甚至型号名称都相同。谢谢! 这将在没有任何非捕获的情况下工作,只需 /model='(.*)'/g 并匹配 match[1] 对,通常没有理由创建非捕获组,除非您确实需要做需要组的事情【参考方案2】:

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

看起来您实际上要查找的是“匹配前缀但排除”组(?&lt;=) 和“匹配后缀但排除”组(?=)

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

【讨论】:

我相信这个后面的样子在 Safari 上也不起作用,见 ***.com/questions/51568821/…

以上是关于非捕获组仍然显示在比赛中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sed 中指定非捕获组?

正则表达式 - 非捕获组返回所谓的非捕获组,,? [复制]

什么是正则表达式“独立非捕获组”?

正则表达式 1. 分组提取/非捕获组

正则表达式中的非捕获组(non-capturing)的用法

非捕获组不在正则表达式中工作