gpt4 book ai didi

javascript - Google Apps 脚本正则表达式 exec() 返回 null

转载 作者:行者123 更新时间:2023-12-03 16:37:11 24 4
gpt4 key购买 nike

当我在 Debug模式下运行下面的代码时,我在 for 循环的第一次迭代中获得了预期值,但在第二次迭代中为 null,如图所示:

第一次迭代:
enter image description here

第二次迭代:
enter image description here

我哪里错了?

我正在使用的代码是:

var newer_than = ' newer_than:2d'; //added for faster debugging
var subjectIdentifier = '"Ingress Portal Submitted: "';
var searchString = 'subject:'+subjectIdentifier+newer_than;

function getPortalName(string) {
var myRegexp = /: (.+)/g;
var match = myRegexp.exec(string);
var portalName = match[1];
return portalName;
}

function getPortalsSubmitted() {
var threads = GmailApp.search(searchString);
for (i=0; i<threads.length; i++) {
var subject = threads[i].getFirstMessageSubject();

var portalName = getPortalName(subject);
var subDate = threads[i].getMessages()[0].getDate();

Logger.log([portalName,subDate]);
}
}

function updatePortals() {
var threads = GmailApp.search('subject:"Ingress Portal"');
for (i=0; i<threads.length; i++) {
Logger.log(threads[i].getFirstMessageSubject());
}
}

最佳答案

尽管评论中已经回答了这个问题,但我会做出正确的回答。

了解此问题的一个重要问题是 exec正则表达式具有 g 时的行为旗帜。其中,当按顺序调用时,即使您传递不同的字符串,也会尝试查找“下一个”匹配项。这里是 documentation link在 MDN 上。

尽管 MDN 声明您应该注意不要重新创建 RegExp 对象(即使是文字),因为它可能会重置 lastIndex属性(property)。至少在 Apps Script 中这是不正确的。如果在代码中的完全相同的位置反复使用正则表达式文字,Apps 脚本会缓存该正则表达式并重复使用相同的对象。

这两种效果相结合意味着您在不知不觉中触发了代码上的“下一个匹配”行为。

对您来说最简单的解决方案是删除 g标志,因为无论如何你都不需要它(你只得到第一个结果)。但是您也可以通过替换 var myRegexp = /: (.+)/g; 来解决此问题。符合 var myRegexp = new RegExp(': (.+)','g'); ,强制 Apps 脚本为您提供一个新对象。

我认为我们可以从中吸取的一个很好的教训是:如果你不需要它,就不要使用它。有时我们很懒惰,不假思索地设置标志,“以防万一”。

关于javascript - Google Apps 脚本正则表达式 exec() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16961953/

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