【问题标题】:Google App Script Regex on subject in for loopfor循环中主题的Google App Script Regex
【发布时间】:2016-08-24 08:41:34
【问题描述】:

我正在尝试应用正则表达式从几封邮件的主题(从标签)中提取数据。 我每隔一个邮件都会得到一个结果?正则表达式是正确的,我使用在线工具针对该模式测试了所有主题。

有人知道怎么了?我已经尝试了十几件事,但没有运气。

代码

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 开始时,我得到 ​​p>

[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

【问题讨论】:

    标签: regex google-apps-script


    【解决方案1】:

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

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

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

    如果您的正则表达式使用“g”标志,您可以多次使用exec() 方法在同一字符串中查找连续匹配项。当您这样做时,搜索将从正则表达式的lastIndex 属性指定的str 的子字符串开始test() 也将推进lastIndex 属性)。

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

    解决方案是简单地删除g(我建议在\s 之后使用* 量词来处理多个空格(如果有),并在最后用.* 替换.*? 以获取所有1 中的其余行不检查每个字符):

    var re = /Week (\d{1,2})\s*[-:]\s*(.*)/i;
    

    【讨论】:

      【解决方案2】:

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

      re.lastIndex = 0;  
      

      这里是你的带有修改的代码:

      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

      【讨论】:

      • 你需要重置正则表达式的lastindex,即使你在每个循环中重新创建了var(不要问我为什么)
      • 谢谢!你只是为我节省了几个小时的诅咒;-)
      • 无需重置任何内容,只需使用var re = /Week (\d{1,2})\s?[-:]\s?(.*?)$/i; - 无需/g。然后你可以删除re.lastIndex = 0;。只需使用您需要的,不多也不少,您的代码将保持高效和简洁。
      • @WiktorStribiżew 你是对的,在这种情况下最好删除“g”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 2020-12-20
      相关资源
      最近更新 更多