本地正则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对象”