我无法从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
答案 0 :(得分:1)
将带有全局修饰符的正则表达式传递给lastIndex
后,正则引擎内部会修改RegExp#exec
值。
如果正则表达式使用
"g"
标志,则可以多次使用exec()
方法在同一字符串中查找连续匹配。执行此操作时,搜索从正则表达式lastIndex
属性指定的str的子字符串开始(test()
也将提升lastIndex
属性。)
另外,请参阅15.10.6.2 RegExp.prototype.exec(string)
了解确切的RegExp#exec
规范。特别是:
- 如果全球 为真,则 一个。使用参数“ lastIndex ”, e 和 true 调用 R 的[[Put]]内部方法。
醇>
由于模式与未标记的空字符串不匹配,因此无法发生无限循环。它是var myRe = /ab*/g;
,因此a
在输入中是低调的,以返回有效匹配。如果是var myRe = /a*/g;
,则会出现无限循环。
答案 1 :(得分:0)
我不知道的是程序如何知道从最后一个索引开始搜索
在正则表达式myRe
中,有一个属性.lastIndex
,告诉.exec
应该从哪里开始解析。
.exec
很有用。
有关.exec
工作原理的详细信息,您可以查看this page on MDN。