单个函数中有多个RegExp
Multiple RegExp in single function
这并不完全是一个问题,而是一个方法问题。我正在做一个项目,人们可以在输入字段中键入缩写日期,例如,如果您只键入"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;
}
我相信您可以合并一些正则表达式,使其更加紧凑。
我首先注意到的是,空白似乎是输入字符串中的一个重要分隔符。具体来说,日期(或天)总是用空格与小时/分钟隔开。所以我要做的第一件事就是把你的输入分成一个空间:
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/other字符串扫描手动编写scanner,并以您所做的方式处理结果。它适用于简单的语言,不需要语言设计部门的太多知识,而且通常修改起来很直观。
然而,如果你觉得输入会变得更复杂,我建议用全面的解析器/lexer取代RegExp扫描,例如使用Jison"你友好的JavaScript解析器生成器!"或任何适合你的东西。
相关文章:
- js.erb文件中提供给RegExp构造函数的标志无效
- Javascript RegExp 与构造函数和文字不同的结果
- Javascript regexp 测试行为与函数
- Javascript 字符串使用 regExp 和 replacer 函数替换
- 单个函数中有多个RegExp
- 使用RegExp构造函数的具有可变模式的JavaScript正则表达式
- RegExp的exec()函数和String的match()函数有什么区别
- 我可以在JSON存储RegExp和函数
- 防止在JavaScript中污染RegExp构造函数的属性
- 何时使用RegExp构造函数vs正则表达式文本
- RegExp构造函数属性输入
- Javascript regExp - replace函数应该决定不替换匹配的字符串,以便让其他括号内的子匹配字符串与匹
- RegExp不是一个函数
- JS Regexp替换"illegal"字符来创建PHP函数名
- 通过对象匹配Javascript regexp中的空白,通过regexp构造函数创建
- 未捕获的SyntaxError:提供给RegExp构造函数的无效标志'usuario'
- 使用RegExp函数
- 转义字符串用于高亮显示函数时出错(js -regexp)
- RegExp替换函数中的反向引用不起作用
- 匹配字符串“/$"在RegExp构造函数中