Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google应用程序脚本Regex exec()返回null_Javascript_Regex_Google Apps Script - Fatal编程技术网

Javascript Google应用程序脚本Regex exec()返回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

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

第一次迭代:

第二次迭代:

我怎么了?

我使用的代码是:

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
标志行为的说明。