这不是一个问题,而是一个方法问题。 我正在开发一个项目,人们可以在输入字段中键入速记日期,例如,如果您只需键入“20”,输入将自动显示本月20日的完整日期。 有许多简写类型可能,所以我不得不制作多个RegExp,然后检查每一个。
我的问题是,有没有更好的方法来解决这个问题?我不是javaScript专家,但我觉得这不是“最佳实践”。
这是函数
function dateParser(date) {
var splitDate = date.split(/[.:\s]/);
var day = new RegExp(/\b\d{1,2}\b/);
var dateHour = new RegExp(/\b\d{1,2}\s\d{1,2}\b/);
var dateHourMin = new RegExp(/\b\d{1,2}\s\d{1,2}[:]\d{1,2}\b/);
var dateMonth = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}\b/);
var dateMonthHour = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}\s\d{1,2}\b/);
var dateMonthHourMin = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}\s\d{1,2}[:]\d{1,2}\b/);
var dateMonthYear = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}[\/\-\,\.]\d{1,4}\b/);
var dateMonthYearHour = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}[\/\-\,\.]\d{1,4}\s\d{1,2}\b/);
var dateMonthYearHourMin = new RegExp(/\b\d{1,2}[\/\-\,\.]\d{1,2}[\/\-\,\.]\d{1,4}\s\d{1,2}[:]\d{1,2}\b/);
var month = new Date().getMonth() + 1;
var year = new Date().getFullYear();
var newDate;
if(dateMonthYearHourMin.test(date)) {
newDate = splitDate[0]+"."+splitDate[1]+"."+splitDate[2]+" "+splitDate[3]+":"+splitDate[4];
}
else if(dateMonthYearHour.test(date)) {
newDate = splitDate[0]+"."+splitDate[1]+"."+splitDate[2]+" "+splitDate[3]+":00";
}
else if(dateMonthYear.test(date)) {
newDate = splitDate[0]+"."+splitDate[1]+"."+splitDate[2]+" 12:00";
}
else if(dateMonthHourMin.test(date)) {
newDate = splitDate[0]+"."+splitDate[1]+"."+year+" "+splitDate[2]+":"+splitDate[3];
}
else if(dateMonthHour.test(date)) {
newDate = splitDate[0]+"."+splitDate[1]+"."+year+" "+splitDate[2]+":00";
}
else if(dateMonth.test(date)) {
newDate = splitDate[0]+"."+splitDate[1]+"."+year+" 12:00";
}
else if(dateHourMin.test(date)) {
newDate = splitDate[0]+"."+month+"."+year+" "+splitDate[1]+":"+splitDate[2];
}
else if(dateHour.test(date)) {
newDate = splitDate[0]+"."+month+"."+year+" "+splitDate[1]+":00";
}
else if(day.test(date)) {
newDate = splitDate[0]+"."+month+"."+year+" 12:00";
}
return newDate;
}
答案 0 :(得分:0)
您描述的问题由编程/查询语言设计字段Natural Language Processing处理。
解决这类问题的方法之一是使用RegExp /其他字符串扫描手动编写的扫描程序,并按照您的方式处理结果。它适用于简单语言,在语言设计部门不需要太多知识,通常可以直观地修改。
如果你觉得输入会变得更复杂,我建议用完全成熟的解析器/词法分析器替换RegExp扫描,例如使用Jison “友好的JavaScript解析器生成器!”< / em>或任何其他适合你的人。
答案 1 :(得分:0)
我相信你可以合并一些正则表达式并使其更紧凑。
我注意到的第一件事是空格似乎是输入字符串中的重要分隔符。具体而言,日期(或日期)始终与带有空格的小时/分钟分开。所以我要做的第一件事就是将你的输入分成一个空格:
var parts = date.split( /\s/ );
var datePart = parts[0];
var timePart = parts[1]; // could be undefined
现在我们可以分别处理日期部分和时间部分(如果存在)。日期部分的组件始终用斜杠,短划线,逗号或句点分隔,所以我们再次将其拆分:
parts = datePart.split( /[\/\-\,\.]/ );
var day = parts[0];
var month = parts[1] // could be undefined
var year = parts[2]; // could be undefined
您可以类似地分割时间,因为小时和分钟始终用冒号分隔:
if( timePart ) {
parts = timePart.split( /:/ );
var hour = parts[0];
var minute = parts[1]; // could be undefined
}
这应该使它更紧凑,易于阅读和维护。你可以用一个单独的正则表达式与组进行更紧凑,但我觉得这种方法会更好。