首页 > 解决方案 > 正则表达式连续循环而不终止寻找匹配

问题描述

我需要找到匹配的位置,我试过了

function myFunction() {
  var myvar_thru_textbox="u?"

  var ptrn = new RegExp(myvar_thru_textbox, "gim");

  var match;

  while ((match = ptrn.exec("color colour")) != null) {
    console.log(JSON.stringify(match));   
  }

}

此代码使用字符串“”产生无限输出

当模式更改为“ou?”时 它产生正确的输出,为什么?如果前面有一个字符,字符会变为无穷大?

我只希望在“u?”时产生“”或“u”。使用正则表达式。

标签: javascriptregex

解决方案


根据文件

JavaScript RegExp 对象在设置了全局或粘性标志(例如/foo/g/foo/y)时是有状态的。他们存储lastIndex上一场比赛的 a。

...

如果匹配成功,则 exec() 方法返回一个数组并更新lastIndex正则表达式对象的属性。

现在想象一下第一次迭代会发生什么。正则表达式在索引 0 处找到零宽度匹配,因此将其设置lastIndex为 0。然后在第二次迭代中,它从 0 开始搜索,在那里找到另一个零宽度匹配,因此lastIndex再次设置为 0。并且循环继续。

因此,您应该在那里放置一个 if 语句来检查匹配是否为零宽度。如果是,请增加最后一个索引,这样它就不会再次给您相同的匹配项。

function myFunction() {
  var ptrn = new RegExp("u?", "gim");

  var match;
  var i = 0;

  while ((match = ptrn.exec("color colour")) != null) {
    console.log(JSON.stringify(match));
    if (match.index == ptrn.lastIndex) {
      ptrn.lastIndex++;
    }

  }

}
myFunction()


推荐阅读