2017-09-25 47 views
0

我正在编写一个Google Apps脚本来基于我收到的有关作业的自动电子邮件创建日历事件。我正在使用正则表达式来提取我需要在Google日历中填充事件的信息。到目前为止,除了一个函数getEndTime(),它可以找到作业的结束时间,但是在任何时候调用它时都会返回null,所有的功能都按预期运行。我所有使用exec()的其他函数都可以正常工作。Google App脚本Regex exec()仅在一个函数中返回null

我已经阅读了很多关于exec()返回null并解决了常见问题的其他问题,比如在调用exec()之前删除'g'标记并将lastIndex重置为0。我还用Javascript选项使用regex101.com检查了我的正则表达式,该选项显示了我期望的文本匹配。

上regex101工作,但不是在我的代码我的正则表达式的表达式为:

/(Substitute\s+Report\s+Times:\s+[0-9_ ]*:[0-9_ ]*\s+[A-Z_ ]*\s+-\s+)([0-9_ ]*:[0-9_ ]*\s+(AM|PM))(\r|\n)/ 

我的代码是:

function findJobs() { 
//Searches Gmail for substitute jobs and creates an event on the calendar 

    //Gets emails with 'NewJobs' label 
    var label = GmailApp.getUserLabelByName("NewJobs"); 
    var threads = label.getThreads(); 
    for (var i = 0; i < threads.length; i++){ 

    var messages = threads[i].getMessages(); 
    Logger.log("Thread " + i); 

    for (var j = 0; j < messages.length; j++) { 
     Logger.log("Message " + j); 

     //gets email body in plain text 
     var body = messages[j].getPlainBody(); 
     Logger.log("Getting body..." + j); 

     //gets school name 
     var school = getSchool(body); 
     Logger.log(school); 

     //gets start time 
     var starttime = getStartTime(body); 
     Logger.log(starttime); 

     //gets end time 
     var endtime = getEndTime(body); 
     Logger.log(endtime); 

     //gets teacher name 
     var teacher = getTeacher(body); 
     Logger.log(teacher); 

     //gets school address 
     var address = getLocation(body); 
     Logger.log(address); 

     //gets date 
     var startdate = getDate(body); 
     Logger.log(startdate); 

     CalendarApp.getDefaultCalendar().createEvent("Subbing - " + school, new Date(startdate + " " + starttime), new Date(startdate + " " + endtime), {location: address, description: teacher}); 
     //threads[j].removeLabel(label); 
    } 
    } 
    Logger.log("--Done--"); 
} 

function getSchool(text){ 
    //Gets the school name from an assignment email 

    //Regular expression for school name 
    var regex = /(School\s+:\s+)([a-zA-Z0-9_ ]*)(\r|\n)/; 
    regex.lastIndex = 0; 
    var match = regex.exec(text)[2]; 

    return match; 
} 

function getDate(text){ 
    //Gets the start date from an assignment email 

    //Regular expression for start date 
    var regex = /(Date:\s+)([0-9_ ]*\/[0-9_ ]*\/[0-9_ ]*)(\r|\n)/; 
    regex.lastIndex = 0; 
    var match = regex.exec(text)[2]; 

    return match; 
} 

function getStartTime(text){ 
    //Gets the start time from an assignment email 

    //Regular expression for start time 
    var regex = /(Substitute\s+Report\s+Times:\s+)([0-9_ ]*:[0-9_ ]*\s+(AM|PM))/; 
    regex.lastIndex = 0; 
    var match = regex.exec(text)[2]; 

    return match; 
} 

function getEndTime(text){ 
    //Gets the end time from an assignment email 

    //Regular expression for end time 
    var regex = /(Substitute\s+Report\s+Times:\s+[0-9_ ]*:[0-9_ ]*\s+[A-Z_ ]*\s+-\s+)([0-9_ ]*:[0-9_ ]*\s+(AM|PM))(\r|\n)/; 
    regex.lastIndex = 0; 
    Logger.log("End Time reset index..."); 
    var match = regex.exec(text)[2]; 
    Logger.log("End Time exec..."); 

    return match; 
} 

function getTeacher(text){ 
    //Gets the teacher name from an assignment email 

    //Regular expression for teacher name 
    var regex = /(Teacher\s+:\s+)([a-zA-Z0-9_ ]*,[a-zA-Z0-9_ ]*)(\r|\n)/; 
    regex.lastIndex = 0; 
    var match = regex.exec(text)[2]; 

    return match; 
} 

function getLocation(text){ 
    //Gets the location from an assignment email 

    //Regular expression for location 
    var regex = /(Address:\s+)(.*)(\r|\n)/; 
    regex.lastIndex = 0; 
    var match = regex.exec(text)[2]; 

    return match; 
} 

下面是一个典型的电子邮件我收到:

You have been assigned as a substitute for a job starting on 9/21/2017. 
The following are the details of the job: 
************* 
Job Summary 
************* 
Starting On    : 9/21/2017 
School      : School Site 
Title      : Pre School Teacher 
Teacher     : Name, Teacher 
Substitute     : Name, Substitute 
Confirmation #    : 123456 

********** 
Job Days 
********** 
School 

--------------------------------------- 
School Site 
Date: 9/21/2017 
Employee Times: 8:00 AM - 3:30 PM 
Substitute Report Times: 8:00 AM - 3:30 PM 

*********************************** 
School Contact Information 
*********************************** 
School Site 
----------------------------------------------------------- 
Address: 123 Main Ave Anytown , USA 555555 
Phone: 5555555555 
----------------------------------------------------------- 
********************** 
Special Instructions 
********************** 



Please do not reply to this system generated message. If you need help or have additional questions, please send an email to [email protected] 

Thank you for using the substitute assignment system. Powered by Aesop 

回答

0

您使用的图案看起来过于复杂。我无法确定是什么原因导致它失败,但我的猜测是最后的(\r|\n)(注意,如果你真的想这样做,你可以输入[\r\n])。

给这个模式的尝试:

Substitute Report Times:.+ - (\d{1,2}:\d{1,2} [AP]M)

这假设结束时间总是一个连字符和空格,这看起来是从您提供的样本文本的情况之前。

+0

你的模式工作!我确实必须将索引从2更改为1,但它工作正常!出于好奇,我尝试用[\ r \ n]替换(\ r | \ n),但我仍然得到相同的错误。我将研究你的替代模式,看看我还能从中学到什么。谢谢! –

+0

对不起,我并不是想说''[\ r \ n]'会解决'(\ r | \ n)'造成的问题;只是它们在匹配的方面是同义词,但前者更简单,成本更低,因为它不会创建捕获组。无论何时,只要匹配一组单个字符中的一个,方括号就是要走的路(有一些例外)。 – CAustin

+0

好吧,明白了!我仍然无法弄清楚我以前的模式有什么问题,但至少现在正在工作,并且我已经学到了一些关于更好的格式化正则表达式的方法。再次感谢! –

相关问题