使用exec查找多个匹配的JavaScript

时间:2016-08-24 19:00:13

标签: javascript regex exec

我无法从MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

解释以下代码
var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) { //confused by this line
  var msg = 'Found ' + myArray[0] + '. ';
  msg += 'Next match starts at ' + myRe.lastIndex;
  console.log(msg);
}

我对while循环线感到困惑。它似乎将myArray设置为在字符串str上调用exec的结果,并且如果它不等于null则表示继续。

我不知道的是程序如何知道从找到匹配项的最后一个索引开始搜索。对我来说,它看起来应该是一个无限循环b / c我无法看到它从数组中的下一个索引开始搜索的位置。

另外,有没有理由使用exec来查找多个匹配而不仅仅是使用匹配? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match

2 个答案:

答案 0 :(得分:1)

将带有全局修饰符的正则表达式传递给lastIndex后,正则引擎内部会修改RegExp#exec值。

  

如果正则表达式使用"g"标志,则可以多次使用exec()方法在同一字符串中查找连续匹配。执行此操作时,搜索从正则表达式lastIndex属性指定的str的子字符串开始(test()也将提升lastIndex属性。)

另外,请参阅15.10.6.2 RegExp.prototype.exec(string)了解确切的RegExp#exec规范。特别是:

  
      
  1. 如果全球 为真,则   一个。使用参数“ lastIndex ”, e true 调用 R 的[[Put]]内部方法。
  2.   

由于模式与未标记的空字符串不匹配,因此无法发生无限循环。它是var myRe = /ab*/g;,因此a在输入中是低调的,以返回有效匹配。如果是var myRe = /a*/g;,则会出现无限循环。

另外,请检查Zero-Length regexes and infinite matches?主题。

答案 1 :(得分:0)

  

我不知道的是程序如何知道从最后一个索引开始搜索

在正则表达式myRe中,有一个属性.lastIndex,告诉.exec应该从哪里开始解析。

当你想要逐个解析一个字符串而不是一次解析时,

.exec很有用。

有关.exec工作原理的详细信息,您可以查看this page on MDN