非捕获组仍然显示在比赛中
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】:
非捕获组基本上只是一个非组——一种使用括号而不实际将模式的那部分视为一个组的方式。
看起来您实际上要查找的是“匹配前缀但排除”组(?<=)
和“匹配后缀但排除”组(?=)
。
注意: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/…以上是关于非捕获组仍然显示在比赛中的主要内容,如果未能解决你的问题,请参考以下文章