我循环遍历一个对象数组并将它们映射到我自己的自定义对象。我正在通过正则表达式提取数据。我在循环中的第一次运行工作正常,但在后续迭代中,尽管它们匹配,但匹配变量不会被设置。
这是正则表达式之一:
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中,如果我多次使用它们,我需要做什么?
答案 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
全局标记在你的情况下,后一种选择是正确的。
进一步阅读: