日期时间格式的动态正则表达式
-
09-06-2019 - |
题
是否有现有的解决方案可以根据给定的日期时间格式模式动态创建正则表达式?支持的日期时间格式模式并不重要(Joda DateTimeFormat、java.text.SimpleDateTimeFormat 或其他)。
IE。对于给定的日期时间格式(例如“dd/MM/yyyy hh:mm”),它将生成相应的正则表达式来匹配指定格式内的日期时间。
解决方案
我猜你的时间格式可以用有限的字母表来构建。这意味着, "HH"
始终是 24 小时制的“小时”, "dd"
始终是带有前导零的日期,依此类推。
由于时间格式的顺序性质,您可以尝试对格式字符串进行标记 "dd/mm/yyyy HH:nn"
到一个数组中 ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]
. 。然后继续通过替换从该数组形成一个模式字符串 "HH"
和 "([01][0-9]|2[0-3])"
等等。将这些模式原子预先构建到查找表/数组中。数组中不在查找表中的所有部分都是文字。根据正则表达式规则将它们转义并将它们附加到您的模式字符串中。
编辑:作为基于正则表达式的解决方案的副作用,当您将查找表的所有正则表达式“原子”放入括号中并在给定格式字符串中跟踪它们的顺序时,您将能够使用子匹配来提取所需的组件从匹配中获取并将它们输入 CreateDate 函数,从而完全跳过 ParseDate 部分。
其他提示
如果您正在寻找基本的日期检查。此代码与此数据匹配。
\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b
10/07/2008
10.07.2008
1-01/2008
10/07/08
10.07.2008
1-01/08
通过 regexbuddy 的代码
SimpleDateFormat
已经这样做了 parse()
方法。
如果您需要从单个字符串解析多个日期,请从正则表达式开始(即使它匹配得太宽松),然后使用 parse()
正则表达式找到的所有潜在匹配项。
下面给出的动态 js/jQuery 代码仅生成日期格式的正则表达式,不适用于日期时间(开发版本尚未完全测试。)
日期格式应为“ D M Y ”
例如。
日-月-年,
日-月-年,
年-月-日,
年-日-月,
月-日-年,
月-日-年,
日/月/年,
日/月/年,
年/月/日,
年/日/月,
月/日/年,
月/日/年
或其他格式但使用 [ D M Y ] 字符创建
var dateFormat = "DD-MM-YYYY";
var order = [];
var position = {"D":dateFormat.search('D'),"M":dateFormat.search('M'),"Y":dateFormat.search('Y')};
var count = {"D":dateFormat.split("D").length - 1,"M":dateFormat.split("M").length - 1,"Y":dateFormat.split("Y").length - 1};
var seprator ='';
for(var i=0; i<dateFormat.length; i++){
if(["Y","M","D"].indexOf(dateFormat.charAt(i))<0){
seprator = dateFormat.charAt(i);
}else{
if(order.indexOf(dateFormat.charAt(i)) <0 ){
order.push(dateFormat.charAt(i));
}
}
}
var regEx = "^";
$(order).each(function(ok,ov){
regEx += '(\d{'+count[ov]+'})'+seprator;
});
regEx = regEx.substr(0,(regEx.length)-1);
regEx +="$";
var re = new RegExp(regEx);
console.log(re);
注意 - 几个月 /天没有验证检查,例如。月份应在 01-12 或日期应在 01-31