从字符串中提取日期

问题描述:

我有一个列表,其文件名大致如下:Gadget1-010912000000-020912235959.csv,即它们包含两个日期,指示其数据的时间跨度。从字符串中提取日期

用户输入一个日期格式和文件格式:在这种情况下

  • 文件格式:* GADGET * - * DATE_FROM * - 在这种情况下,* DATE_TO * .CSV
  • 日期格式:ddMMyyHHmmss

我想要做的是从给定文件和日期格式的文件名中提取三个值。

我的问题是:由于日期格式可能会有很大的不同(小时,分钟和秒可以用冒号分隔,日期由点,...)我不知道如何创建一个适合的正则表达式。

+0

如果原来的日期格式不固定,这将是困难的,容易出错。 – assylias

+0

你能举出更多日期格式的例子吗?最好的,如果它涵盖了你所有的情况。 – nhahtdh

+0

您需要将所有变体标准化为通用格式。只有你知道所有变化是什么以及如何改变它们。 –

您可以使用正则表达式来删除非数字字符,然后解析值。

DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); 

String[] fileNameDetails = ("Gadget1-010912000000-020912235959").split("-"); 

/*Catch All non digit characters and removes it. If non exists maintains original string*/ 
String date = fileNameDetails[1].replaceAll("[^0-9]", ""); 

try{ 
    dateFormat.parse(fileNameDetails[1]); 
}catch (ParseException e) { 
} 

希望它有帮助。

SimpleDateFormat解决了您的问题。你可以用逗号,空格以及任何定义的格式,并按照格式简单解析:

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

所以你您的格式(例如ddMMyyHHmmss)映射到相应的SimpleDateFormat。

SimpleDateFormat format = new SimpleDateFormat("ddMMyyHHmmss"); 
Date x = format.parse("010912000000"); 

如果格式更改,您只需更改的SimpleDateFormat

您可以使用一系列的日期时间格式,尝试每一个直到一个工作。

您可能需要对格式进行排序以优先匹配。

例如,对于Joda时间,您可以使用DateTimeFormat.forPattern()DateTimeFormatter.getParser()作为一系列模式中的每一个。尝试DateTimeParser.parseInto(),直到成功。

这种方法的一个好处是,它很容易添加和删除模式。

使用PatternMatcher类。

看一下例子:

String inputDate = "01.09.12.00:00:00"; 
Pattern pattern = Pattern.compile(
    "([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})"); 
    Matcher matcher = pattern.matcher(inputDate); 
    matcher.find(); 
    StringBuilder cleanStr = new StringBuilder(); 
    for(int i = 1; i <= matcher.groupCount(); i++) { 
    cleanStr.append(matcher.group(i)); 
    } 
    SimpleDateFormat format = new SimpleDateFormat("ddMMyyHHmmss"); 
    Date x = format.parse(cleanStr.toString()); 
    System.out.println(x.toString()); 

最重要的部分是线

Pattern pattern = Pattern.compile(
    "([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})[:]{0,1}([0-9] 

在这里您可以定义正则表达式和paranthesis标记组,以便([0-9]{2})标志着一个组。然后是在这种情况下可能的分度符[\\.]* 0或1个点,但您可以放置​​更多可能的分度符,例如[\\.|\]{0,1}

然后运行matcher.find(),如果模式匹配,则返回true。然后使用matcher.group(int)你可以逐组。请注意,第一组的索引是1.

然后我使用StringBuilder构造干净日期String。然后解析日期。

干杯, 米哈尔