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

Local Regex Match Variable Not Updated

本文关键字:变量 更新 正则表达式      更新时间:2023-09-26

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

下面是一个正则表达式:

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,我需要做的,如果我使用它们不止一次?

当你有一个全局标志为/.../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全局标志

在你的情况下,后一个选项将是正确的。


进一步阅读:

  • .exec()在MDN上
  • MSDN上的.exec()
  • "How Use The JavaScript RegExp Object" on regular-expressions.info