本地正则表达式匹配变量未更新

时间:2013-01-06 08:08:09

标签: javascript regex node.js

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

这是正则表达式之一:

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中,如果我多次使用它们,我需要做什么?

1 个答案:

答案 0 :(得分: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全局标记

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


进一步阅读: