Javascript Google应用程序脚本Regex exec()返回null
当我在调试模式下运行下面的代码时,我在for循环的第一次迭代中得到了期望值,但在第二次迭代中得到了null,如图所示: 第一次迭代: 第二次迭代: 我怎么了? 我使用的代码是:Javascript Google应用程序脚本Regex exec()返回null,javascript,regex,google-apps-script,Javascript,Regex,Google Apps Script,当我在调试模式下运行下面的代码时,我在for循环的第一次迭代中得到了期望值,但在第二次迭代中得到了null,如图所示: 第一次迭代: 第二次迭代: 我怎么了? 我使用的代码是: var newer_than = ' newer_than:2d'; //added for faster debugging var subjectIdentifier = '"Ingress Portal Submitted: "'; var searchString = 'subject:'+subjectId
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());
}
}
var newer_than='newer_than:2d'//为了更快的调试,添加了
var subjectIdentifier='“入口门户已提交:”;
var searchString='subject:'+subjectIdentifier+newer_-than;
函数getPortalName(字符串){
var myRegexp=/:(.+)/g;
var match=myRegexp.exec(字符串);
var portalName=match[1];
返回portalName;
}
函数getPortalSubmitted(){
var threads=GmailApp.search(searchString);
对于(i=0;i虽然这个问题已经在评论中得到了回答,但我会做出正确的回答
理解此问题的一个重要问题是当正则表达式具有g
标志时的exec
行为。当按顺序调用时,该标志将尝试查找“下一个”匹配项,即使您传递了不同的字符串。下面是关于MDN的说明
尽管MDN声明您应该注意不要重新创建RegExp对象(甚至是文字),因为它可能会重置lastIndex
属性。至少在应用程序脚本中,这不是真的。如果在代码中的同一位置反复使用regex文字,则应用程序脚本会缓存regex并重新使用相同的对象
这两种效果的结合意味着您在不知不觉中触发了代码上的“下一个匹配”行为
对你来说,最简单的解决方案是去掉g
标志,因为你无论如何都不需要它(你只得到第一个结果)。但是你也可以通过将var myRegexp=/:(.+)/g;
行替换为var myRegexp=new RegExp(':(.+),'g');
来解决这个问题,强制应用程序脚本给你一个新对象
我认为我们可以从中学到的一个很好的教训是:如果你不需要标志,就不要使用它。有时我们很懒惰,没有考虑“以防万一”就设置标志。是的,这本不应该是个问题。你能用更通用的/:\s*(.+)来代替这个模式吗/g
?我还是会在这里使用split
,比如returnstring.split(/:\s*/)[1]可能吧。现在这很奇怪。事实上,如果regexobject一直都是相同的,那么这种行为是可以解释的——但显然不是。那么,你可以通过从模式中删除/g
修饰符来检查这一点吗?反正这里不需要。我应该回答吗?事实上,@fabriciomatté已经有了答案。)@Raina77如果可以的话,请随意回答,我在接下来的几个小时会有点忙,我真的不喜欢编造解释。:P
您使用的是正则表达式文本,所以您不是每次都创建正则表达式。文本没有作用域。下面是关于g
标志行为的说明。