谷歌应用正则表达式的主题在for循环
问题描述:
我试图应用正则表达式从几个邮件(从标签)的主题提取数据。 我只收到其他邮件的结果?正则表达式是正确的,我使用在线工具测试了所有对象的模式。谷歌应用正则表达式的主题在for循环
任何想法有什么不对?我已经尝试了十几件事,但没有运气。
代码
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
当我开始与我= 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
答
它只是在你的情况下,使用一个全球性的修饰与否的问题。
见
var re = /Week (\d{1,2})\s?[-:]\s?(.*?)$/gi;
var match = re.exec(subject);
你的正则表达式包含一个全局修改g
,与RegExp#exec
使用时,推进的RegExp lastIndex
与每个成功匹配。
如果您的正则表达式使用“g”标志,您可以多次使用
exec()
方法在同一个字符串中查找连续的匹配项。当您这样做时,搜索开始于由正则表达式的lastIndex
属性(test()
也将提前lastIndex
属性)指定的子字符串str
。
由于您使用exec
一次只能得到一个匹配,所以g
修饰符是多余的。
解决方法是删除g
(和我建议使用*
量词\s
后,如果任何处理多个空格,并在年底更换.*?
与.*
抢行的所有休息1个去没有检查每个字符):
var re = /Week (\d{1,2})\s*[-:]\s*(.*)/i;
答
您需要重置正则表达式的最后一个索引(这已对我来说,当我遇到同样的麻烦时,真的很痛苦)
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(不要问我为什么) – Harold
谢谢!你只需要救我几个小时的诅咒;-) – Dimitri
不需要重置任何东西,只需使用'var re =/Week(\ d {1,2})\ s?[ - :] \ s?(。* ?)$ /我;' - 没有'/ g'。然后你可以删除're.lastIndex = 0;'。只需使用你所需要的,不多,不少,并且你的代码将保持高效和缓和。 –