关于日期时间:日期时间格式的动态正则表达式

关于日期时间:日期时间格式的动态正则表达式

Dynamic regex for date-time formats

是否存在现有的解决方案,可以根据给定的日期时间格式模式动态创建正则表达式?支持的日期时间格式模式无关紧要(Joda DateTimeFormatjava.text.SimpleDateTimeFormat或其他)。

作为一个特定示例,对于给定的日期时间格式(如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部分。


如果您要查找基本日期检查,则此代码与该数据匹配。

1
2
3
4
5
6
7
8
\\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

通过正则表达式的代码


下面给出的js / jQuery代码仅用于动态生成的RegEx,仅适用于Date格式,不适用于DateTime(尚未完全测试开发版本。)

日期格式应为" D M Y"。

例如

  • DD-MM-YY
  • DD-MM-YYYY
  • YYYY-MM-DD
  • YYYY-DD-MM
  • MM-DD-YYYY
  • MM-DD-YY
  • DD/MM/YY
  • DD/MM/YYYY
  • YYYY/MM/DD
  • YYYY/DD/MM
  • MM/DD/YYYY
  • MM/DD/YY

或其他格式但使用" DMY"字符创建的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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


SimpleDateFormat已通过parse()方法执行此操作。

如果您需要从一个字符串中解析多个日期,请以正则表达式开始(即使它过于宽松地匹配),并对正则表达式发现的所有可能的匹配项使用parse()


推荐阅读