我试图从这样的字符串中找出日期的前两个字母:
... 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;
}
但这似乎无法正常工作。
如果正则表达式没有匹配,我还需要明天返回。
答案 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)
有两个问题:
您正在使用g
修饰符。这使.match()
返回正则表达式的所有匹配数组。这仅包含整个正则表达式的匹配,而不是捕获组。
匹配结果的元素0
是整个正则表达式的匹配。您希望获得捕获组1,因此您应该使用[1]
,而不是[0]
。
请改用:
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 {
...
}