RegExp与lastIndex匹配会导致无限循环

时间:2018-07-07 12:59:10

标签: javascript regex loops while-loop infinite-loop

以下代码始终导致无限循环,我不知道为什么。

var regex1 = /Hi([^]*?)Hi/g
var str = `
Hi my name is Hi
`;

function doStuff(str) {
  var lastMatchIndex = 0
    while ((m = regex1.exec(str)) !== null) {
        console.log("it's not null")
        //firstblock is the content between the 2 hi's
        var firstblock = m[1] || ""
        if (firstblock !== "") {
            console.log(doStuff(firstblock))
        }
    }
    return str
}
doStuff(str)

我假设while循环将发生一次,并且firstblock等于“我的名字是”。当我调用console.log(doStuff(firstblock))时,将没有匹配项,因此while循环将不会执行,它将在屏幕上显示“ my name is”。怎么了?

我将举一个例子,但它可能会破坏您的浏览器标签。被警告。 :)

1 个答案:

答案 0 :(得分:1)

return;条件内缺少if是为了防止外部递归函数产生无限循环。 console.log(doStuff(firstblock))将第二次调用doStuff函数,然后第二次调用将简单地返回str。将该控件传递给调用递归函数,现在该函数需要将控件返回到doStuff(str),否则while循环将无限执行。

var regex1 = /Hi([^]*?)Hi/g
var str = `Hi my name is Hi`;

function doStuff(str) {
  var lastMatchIndex = 0
  while ((m = regex1.exec(str)) !== null) {
    console.log("it's not null")
    //firstblock is the content between the 2 hi's
    var firstblock = m[1] || ""
    if (firstblock !== "") {
        console.log(doStuff(firstblock));
        return;
    }
  }
  return str
}
doStuff(str)