正则表达式:match和exec返回不同的结果。

4
let regexp = /Rim.*?vert\s(\d*)cm/g
let content = "BEONE SPS SPIRIT, 2012y.b.,26 Rim - BEONE aluminium, vert 51cm «L»,ЕТТ600mm, 835 37 38"

执行content.match(regexp)之后,我得到了:
["Rim - BEONE aluminium, vert 51cm"]

因此,我希望它将匹配的组(51)作为第二个数组元素返回。

但是当我使用regexp.exec(content)时,一切似乎都很好:

["Rim - BEONE aluminium, vert 51cm", "51"]

为什么会有这样的差异?

我的代码\正则表达式出了什么问题,导致返回不同的结果?


如果您删除 g 修饰符,使用 match 将得到相同的结果。我想它知道没有更多的匹配项,因此提供了捕获组。不是很确定,但可能是这样。 - user1106925
@squint 但 Group 是在圆括号里面的,对吧? - Src
是的。但是如果正则表达式是全局的,因此有可能找到多个匹配项,如果它返回完整的字符串加上子组匹配项,这会非常令人困惑。哪里开始,下一个又在哪里结束? - user1106925
4
只需查阅 String.match 文档:“如果正则表达式未包含 g 标志,则返回与 RegExp.exec() 相同的结果[...] 如果正则表达式包含 g 标志,则该方法返回一个数组,其中包含所有匹配的子字符串而不是匹配对象。未捕获的分组不会返回。” - Hamms
2个回答

5

MDN文档中所述

如果您想获取捕获组并且已设置全局标志,则需要使用RegExp.exec()

因此,要使用String.prototype.match()获得相同的结果,请从正则表达式中删除g标志:

let regexp = /Rim.*?vert\s(\d*)cm/ //<-- Removed the "g" flag.
let content = "BEONE SPS SPIRIT, 2012y.b.,26 Rim - BEONE aluminium, vert 51cm «L»,ЕТТ600mm, 835 37 38";

let resultMatch = content.match(regexp);
console.log('result with match:', resultMatch);

let resultExec = regexp.exec(content);
console.log('result with exec:', resultExec);


0
值得一提的是,如果string.match()和regex.exec()的结果相同,那么regex.exec()需要的时间会更长(大约是string.match()的2到30倍):
在这种情况下,只有当您需要全局正则表达式(执行多次)时才使用regex.exec()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接