0

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

用户输入日期格式和文件格式:

  • 本例中的文件格式:*GADGET*-*DATE_FROM*-*DATE_TO*.csv
  • 本例中的日期格式:ddMMyyHHmmss

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

我的问题是:由于日期格式可能有很大差异(小时、分钟和秒可以用冒号分隔,日期用点分隔,...)我不太清楚如何创建合适的正则表达式。

4

4 回答 4

1

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

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) {
}

希望能帮助到你。

于 2012-09-05T14:01:36.043 回答
0

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

于 2012-09-05T13:18:04.137 回答
0

您可以使用一系列日期时间格式,尝试每种格式,直到其中一个有效。

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

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

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

于 2012-09-05T13:21:50.977 回答
0

使用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]

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

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

然后我String使用StringBuilder. 然后解析日期。

干杯,迈克尔

于 2012-09-05T14:19:51.990 回答