关于主题for for循环的Google App Script Regex

时间:2016-08-24 08:41:35

标签: regex google-apps-script

我试图应用正则表达式从几个邮件的主题中提取数据(来自标签)。 我只收到其他邮件的结果?正则表达式是正确的,我使用在线工具测试了所有主题与模式。

任何人都知道出了什么问题?我已经尝试了十几件事,但没有运气。

代码

for (var i = 0; i < 5; i++) {
   var msg = threads[i].getMessages()[0];
   var body = msg.getBody();
   var subject = msg.getSubject();
   Logger.log("#" + subject + "#");
   var re = /Week (\d{1,2})\s?[-:]\s?(.*?)$/gi;
   var match = re.exec(subject);
   Logger.log(match);
   if (match) { 
      Logger.log(match[1] + '---' + match[2]);
   }
}

日志

[16-08-24 10:36:38:003 CEST] #Week 25 - Samosa aardappel koriander#
[16-08-24 10:36:38:004 CEST] [Week 25 - Samosa aardappel koriander, 25, Samosa aardappel koriander]
[16-08-24 10:36:38:005 CEST] 25---Samosa aardappel koriander
[16-08-24 10:36:38:156 CEST] #Week 24 - Pebre#
[16-08-24 10:36:38:156 CEST] null
[16-08-24 10:36:42:318 CEST] #Week 23 - Caramel chocolade shortbread#
[16-08-24 10:36:42:319 CEST] [Week 23 - Caramel chocolade shortbread, 23, Caramel chocolade shortbread]
[16-08-24 10:36:42:319 CEST] 23---Caramel chocolade shortbread
[16-08-24 10:36:42:491 CEST] #Week 22 - Bretzel#
[16-08-24 10:36:42:492 CEST] null
[16-08-24 10:36:42:674 CEST] #Week 21 - Basilicum quenelles#
[16-08-24 10:36:42:675 CEST] [Week 21 - Basilicum quenelles, 21, Basilicum quenelles]
[16-08-24 10:36:42:675 CEST] 21---Basilicum quenelles

当我从i = 1开始时,我得到了

[16-08-24 10:38:44:158 CEST] #Week 24 - Pebre#
[16-08-24 10:38:44:159 CEST] [Week 24 - Pebre, 24, Pebre]
[16-08-24 10:38:44:159 CEST] 24---Pebre
[16-08-24 10:38:44:307 CEST] #Week 23 - Caramel chocolade shortbread#
[16-08-24 10:38:44:307 CEST] null
[16-08-24 10:38:46:463 CEST] #Week 22 - Bretzel#
[16-08-24 10:38:46:463 CEST] [Week 22 - Bretzel, 22, Bretzel]
[16-08-24 10:38:46:463 CEST] 22---Bretzel
[16-08-24 10:38:46:616 CEST] #Week 21 - Basilicum quenelles#
[16-08-24 10:38:46:616 CEST] null

2 个答案:

答案 0 :(得分:1)

你需要重置正则表达式的最后一个索引(当我遇到同样的麻烦时,这对我来说真是太痛苦了)

re.lastIndex = 0;  

这里你的代码是modif:

for (var i = 0; i < 5; i++) {
   var msg = threads[i].getMessages()[0];
   var body = msg.getBody();
   var subject = msg.getSubject();
   Logger.log("#" + subject + "#");
   var re = /Week (\d{1,2})\s?[-:]\s?(.*?)$/gi;
   re. lastIndex = 0;
   var match = re.exec(subject);
   Logger.log(match);
   if (match) { 
      Logger.log(match[1] + '---' + match[2]);
   }
}

要进一步了解,请查看此documentation

答案 1 :(得分:0)

这只是在您的情况下使用全局修饰符的问题。

var re = /Week (\d{1,2})\s?[-:]\s?(.*?)$/gi;
var match = re.exec(subject);

您的正则表达式包含一个全局修饰符g,当与RegExp#exec一起使用时,会在每次成功匹配时提升RegExp lastIndex

  

如果你的正则表达式使用&#34; g&#34; flag,您可以多次使用exec()方法在同一个字符串中查找连续匹配。执行此操作时,搜索从正则表达式str属性指定的lastIndex子字符串开始(test()也会提前{ {1}}属性)。

由于您使用lastIndex一次只能获得一个匹配项,因此exec修饰符是多余的。

解决方案只是删除g(我建议在g之后使用*量词来处理多个空格(如果有的话),并将\s替换为最后.*?抓住所有其余的一行,而不检查每个字符):

.*