Javascript 单函数中的多个RegExp

Javascript 单函数中的多个RegExp,javascript,regex,refactoring,Javascript,Regex,Refactoring,这不完全是一个问题,更多的是一个方法问题。 我正在从事一个项目,人们可以在输入字段中键入速记日期,例如,如果您只需键入“20”,输入将自动显示本月20日的完整日期。 有很多速记类型,所以我必须创建多个RegExp,然后逐一检查 我的问题是,有没有更好的方法来处理这个问题?我不是javaScript专家,但我觉得这不是严格的“最佳实践” 下面是函数 function dateParser(date) { var splitDate = date.split(/[.:

这不完全是一个问题,更多的是一个方法问题。 我正在从事一个项目,人们可以在输入字段中键入速记日期,例如,如果您只需键入“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;
        }

您描述的问题由编程/查询语言设计领域解决

解决这类问题的方法之一是使用RegExp/other字符串扫描手动编写扫描仪,并像您那样处理结果。它适用于简单的语言,不需要语言设计部门的太多知识,并且通常可以直观地修改


但是,如果您觉得输入将变得更加复杂,我建议使用成熟的解析器/词法分析器(例如“您友好的JavaScript解析器生成器”)替换RegExp扫描或者任何适合您的东西。

我相信您可以合并一些正则表达式,使其更加紧凑

我注意到的第一件事是,空白似乎是输入字符串中的一个重要分隔符。具体来说,日期(或日期)总是用空格与小时/分钟分开。因此,我要做的第一件事是将您的输入拆分到一个空间:

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
}

这将使它更加紧凑,易于阅读和维护。您可以使用带有组的单数正则表达式进行更紧凑的操作,但我觉得这种方法会更好。

对我来说,这是一种更干净的方法。在我看来,RegExp是唯一的选择,但这是一个非常好的选择!