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

时间:2008-09-09 14:50:21

标签: regex datetime information-retrieval

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

即。对于给定的日期时间格式(例如“dd / MM / yyyy hh:mm”),它将生成相应的正则表达式以匹配指定格式中的日期时间。

4 个答案:

答案 0 :(得分:3)

我猜你的字母有限,你的时间格式可以构建。这意味着,"HH"在24小时制时间始终为“小时”,"dd"始终为前导零的日期,依此类推。

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


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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

下面给出了仅为Date格式生成动态生成正则表达式的js / jQuery代码,而不是日期时间(开发版本尚未完全测试)。

日期格式应为“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
或其他格式,但使用[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