【问题标题】:Using exec to find multiple matches JavaScript使用 exec 查找多个匹配 JavaScript
【发布时间】:2016-08-24 19:00:12
【问题描述】:

我无法解释来自 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

【问题讨论】:

    标签: javascript regex exec


    【解决方案1】:

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

    如果您的正则表达式使用"g" 标志,您可以多次使用exec() 方法在同一字符串中查找连续匹配项。当您这样做时,搜索将从正则表达式的 lastIndex 属性指定的 str 的子字符串开始(test() 也将推进 lastIndex 属性)。

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

    1. 如果 globaltrue
      一种。使用参数 "lastIndex"、etrue 调用 R 的 [[Put]] 内部方法。

    不会发生无限循环,因为该模式与未指定的空字符串不匹配。它是var myRe = /ab*/g;,因此a 必须在输入中返回有效匹配。如果是var myRe = /a*/g;,那就是死循环了。

    另外,检查Zero-Length regexes and infinite matches? 线程。

    【讨论】:

      【解决方案2】:

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

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

      .exec 在您想逐段解析字符串而不是一次全部解析时很有用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多