gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:12:41 25 4
gpt4 key购买 nike

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

这是正则表达式之一:

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全局标志

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


进一步阅读:

关于javascript - 本地正则表达式匹配变量未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com