2016-08-24 91 views
1

我試圖應用正則表達式從幾個郵件(從標籤)的主題提取數據。 我只收到其他郵件的結果?正則表達式是正確的,我使用在線工具測試了所有對象的模式。谷歌應用正則表達式的主題在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 

回答

0

它只是在你的情況下,使用一個全球性的修飾與否的問題。

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; 
1

您需要重置正則表達式的最後一個索引(這已對我來說,當我遇到同樣的麻煩時,真的很痛苦)

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

+0

你需要重置你就算再在每個循環創造價值中的正則表達式的lastIndex(不要問我爲什麼) – Harold

+0

謝謝!你只需要救我幾個小時的詛咒;-) – Dimitri

+1

不需要重置任何東西,只需使用'var re =/Week(\ d {1,2})\ s?[ - :] \ s?(。* ?)$ /我;' - 沒有'/ g'。然後你可以刪除're.lastIndex = 0;'。只需使用你所需要的,不多,不少,並且你的代碼將保持高效和緩和。 –