Javascript Regex - 如何收集前2个日期字母

时间:2015-04-10 23:28:04

标签: javascript regex

我试图从这样的字符串中找出日期的前两个字母:

... due Monday ...

并为其指定一个数字(是的,这与迄今为止的数字有关)。以下是我尝试过的内容:

var due_min = homework.input.match(/(?:due|by) (.{2})(?:(?:.+?)?)\b/ig)[0].trim().toLowerCase();
    var day_number;
    switch(due_min){
         case 'su':
             day_number = 0;break;
         case 'mo':
             day_number = 1;break;
         case 'tu':
             day_number = 2;break;
         case 'we':
             day_number = 3;break;
         case 'th':
             day_number = 4;break;
         case 'fr':
             day_number = 5;break;
         case 'sa':
             day_number = 6;break;
         default:
             day_number = moment().day()+1;break;
    }

但这似乎无法正常工作。

如果正则表达式没有匹配,我还需要明天返回。

2 个答案:

答案 0 :(得分:1)

您可以使用数组轻松实现

jsfiddle示例...... http://jsfiddle.net/accqq3ya/3/

var regex = /(?:due|by) (.{2})(?:(?:.+?)?)\b/gi
var days = ["su", "mo", "tu", "we", "th", "fr", "sa"];


function getWeekday(text){

    var day = regex.exec(text);
    if( day && (day = day[1]) ){
         var day = days.indexOf(day.toLowerCase().trim());
         if(~day) return day;        
    }
    return moment().day()+1;

}

var day_number = getWeekday(homework.input.value);

答案 1 :(得分:0)

有两个问题:

  1. 您正在使用g修饰符。这使.match()返回正则表达式的所有匹配数组。这仅包含整个正则表达式的匹配,而不是捕获组。

  2. 匹配结果的元素0是整个正则表达式的匹配。您希望获得捕获组1,因此您应该使用[1],而不是[0]

  3. 请改用:

    var due_min = homework.input.match(/(?:due|by) (.{2})(?:(?:.+?)?)\b/i)[1].trim().toLowerCase();
    

    但是,如果输入与正则表达式不匹配,.match()将返回null,而不是数组,并且尝试访问[1]将会出错。最好将结果分配给另一个变量,测试它是否为空,然后执行其余操作:

    var match = homework.input.match(/(?:due|by) (.{2})(?:(?:.+?)?)\b/i);
    if (match) {
        var due_min = match[1].trim().toLowerCase();
        ...
    } else {
        ...
    }