我知道这个主题已经在 StackOverflow 上进行了全面介绍,但我一辈子都无法让我的正则表达式正常工作。因此,无需进一步重复...
这就是我所拥有的。
细绳:<p model='cat'></p>
正则表达式:.match(/(?:model=')(.*)(?:')/g)
这是我的表达式返回的内容:model='cat'
这就是我要的:cat
为什么我的非捕获组没有被忽略?是我不明白非捕获组是做什么的吗?为什么我的正则表达式不起作用?
我知道这个主题已经在 StackOverflow 上进行了全面介绍,但我一辈子都无法让我的正则表达式正常工作。因此,无需进一步重复...
这就是我所拥有的。
细绳:<p model='cat'></p>
正则表达式:.match(/(?:model=')(.*)(?:')/g)
这是我的表达式返回的内容:model='cat'
这就是我要的:cat
为什么我的非捕获组没有被忽略?是我不明白非捕获组是做什么的吗?为什么我的正则表达式不起作用?
整个比赛将始终是第 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
非捕获组基本上只是一个非组 - 一种使用括号的方式,而无需将模式的那部分实际视为一个组。
看起来您实际上正在寻找的是“匹配前缀但排除”组(?<=)
和“匹配后缀但排除”组(?=)
。
注意: 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);