1

我正在遍历一组对象并将它们映射到我自己的自定义对象。我正在通过正则表达式提取数据。我第一次运行循环工作正常,但在随后的迭代中,虽然它们匹配,但匹配变量没有设置。

这是正则表达式之一:

var gameRegex   = /(\^?)([A-z]+)\s?(\d+)?\s+(at\s)?(\^?)([A-z]+)\s?(\d+)?\s\((.*)\)/g;

这是我循环的初始部分:

for(var i = 1; i <= data.count; i++) {
    var gameMatch = gameRegex.exec(data["left" + i]);
    var idMatch = idRegex.exec(data["url" + i]);

第一次,gameMatch 和 idMatch 有值。即使我已经测试过它们确实有效,以下迭代也不起作用。

如果我多次使用正则表达式,可能特别是在 Node.js 中,是否需要做一些事情?

4

1 回答 1

2

当你有一个带有全局标志的正则表达式并与之一起/.../g使用exec()时,JavaScript 会设置一个以lastIndex该正则表达式命名的属性。

s = "abab";
r = /a/g;
r.exec(s);    // ["a"]
r.lastIndex   // 1
r.exec(s);    // ["a"]
r.lastIndex   // 3
r.exec(s);    // null
r.lastIndex   // 0

这意味着用于同一字符串中的多个匹配项。您可以exec()一次又一次地调用,并且每次调用lastIndex都会增加 - 自动定义下一次执行的开始位置:

while (match = r.exec(s)) {
  console.log(match);
}

现在lastIndex将在第一次调用 后关闭exec()。但是由于您每次都传入不同的字符串,因此表达式将不再匹配。

有两种方法可以解决这个问题:

  • 手动设置r.lastIndex = 0每次或
  • 删除g全局标志

在您的情况下,后一种选择将是正确的选择。


进一步阅读:

于 2013-01-06T08:52:33.173 回答