我有一个文件名列表大致如下:Gadget1-010912000000-020912235959.csv,即它们包含两个日期,表示其数据的时间跨度。
用户输入日期格式和文件格式:
我想要做的是使用给定的文件和日期格式从文件名中提取三个值。
我的问题是:由于日期格式可能差别很大(小时,分钟和秒可以用冒号分隔,日期用点,...)我不太清楚如何创建一个合适的正则表达式。
答案 0 :(得分: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) {
}
希望它有所帮助。
答案 1 :(得分: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
即可答案 2 :(得分:0)
您可以使用一系列日期时间格式,尝试每种格式直到一个工作。
您可能需要订购格式以确定匹配的优先顺序。
例如,使用Joda时间,您可以对一系列模式中的每一个使用DateTimeFormat.forPattern()和DateTimeFormatter.getParser()。尝试DateTimeParser.parseInto()直到成功。
这种方法的一个好处是可以轻松添加和删除模式。
答案 3 :(得分:0)
使用Pattern
和Matcher
类。
看一下例子:
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]
在此处定义regexp并在paranthesis中标记组,以便([0-9]{2})
标记一个组。然后是可能的分隔符[\\.]*
的表达式,在这种情况下为0或1点,但是您可以放置更多可能的分隔符,例如[\\.|\]{0,1}
。
然后运行matcher.find()
,如果模式匹配则返回true。然后使用matcher.group(int)
,您可以逐组获取。请注意,第一组的索引是1.
然后我使用String
构建清洁日期StringBuilder
。然后解析日期。
干杯, 米甲