REGEX:match和exec返回不同的结果

时间:2017-02-07 02:17:45

标签: javascript regex

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"]

为什么会有这样的差异?

我的code \ regexp有什么问题,所以它会返回不同的结果?

2 个答案:

答案 0 :(得分:1)

String.prototype.match() MDN documentation中所述:

  

如果你想获得捕获组并且设置了全局标志,那么你   需要使用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);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

值得一提的是,如果string.match()和regex.exec()的结果相同,则regex.exec()将花费更多的时间(在x2到x30之间) string.match():

在这种情况下,仅在需要全局正则表达式(执行多次)时才使用regex.exec()。