5

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

作为一个具体的例子,对于给定的日期时间格式,如dd/MM/yyyy hh:mm,它应该生成相应的正则表达式来匹配指定格式内的日期时间。

4

4 回答 4

3

我猜您的时间格式可以由有限的字母构成。这意味着,"HH"将始终是 24 小时制的“小时”,"dd"始终是前导零的一天,依此类推。

由于时间格式的顺序性,您可以尝试将格式字符串标记"dd/mm/yyyy HH:nn"为数组["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]。然后继续并通过替换等从该数组中形成一个模式"HH"字符串"([01][0-9]|2[0-3])"。将这些模式原子预构建为查找表/数组。不在查找表中的数组的所有部分都是文字。根据正则表达式规则将它们转义并将它们附加到您的模式字符串中。


编辑:作为基于正则表达式的解决方案的副作用,当您将查找表的所有正则表达式“原子”放入括号中并在给定格式字符串中跟踪它们的顺序时,您将能够使用子匹配来提取匹配所需的组件并将它们提供给 CreateDate 函数,从而完全跳过 ParseDate 部分。

于 2008-10-08T08:49:16.447 回答
1

如果您正在寻找基本的日期检查,此代码与此数据匹配。

\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 编写代码

于 2008-10-07T15:28:41.290 回答
0

SimpleDateFormat已经使用该parse()方法执行此操作。

如果您需要从单个字符串中解析多个日期,请从正则表达式开始(即使它匹配过于宽松),并使用parse()正则表达式找到的所有潜在匹配项。

于 2008-09-09T15:24:51.980 回答
0

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

日期格式应为“ DMY ”。

例如

  • DD-MM-YY
  • DD-MM-YYYY
  • YYYY-MM-DD
  • YYYY-DD-MM
  • MM-DD-YYYY
  • 月-日-年
  • 日/月/年
  • 日/月/年
  • 年年/月/日
  • YYYY/DD/MM
  • 月/日/年
  • 月/日/年

或其他格式但使用“ DMY ”字符创建:

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

于 2016-12-28T13:42:34.803 回答