本地正则expression式匹配variables未更新

我正在循环一个对象的数组,并映射到我自己的自定义对象。 我正在通过正则expression式提取数据。 我第一次运行循环工作正常,但在后续的迭代中,尽pipe匹配,匹配variables不会被设置。

这是正则expression式之一:

var gameRegex = /(\^?)([Az]+)\s?(\d+)?\s+(at\s)?(\^?)([Az]+)\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有价值。 即使我已经testing了他们的工作,下面的迭代也不起作用。

有没有关于正则expression式的东西,特别是在Node.js中,如果我多次使用它们,我需要做些什么?

当你有一个带有全局标志/.../g的正则expression式并且使用exec()时,JavaScript会在该正则expression式上设置一个名为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 

这意味着用于同一个string中的多个匹配。 你可以一次又一次地调用exec() ,每次调用lastIndex都会增加 – 自动定义下一次执行的地方:

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

现在,在第一次调用exec()之后, lastIndex将被closures。 但是,由于每次都传递不同的string,expression式将不再匹配。

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

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

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


进一步阅读:

  • .exec()上的.exec()
  • .exec()在MSDN上
  • regular-expressions.info上的“如何使用JavaScript RegExp对象”