2012-09-05 97 views
0

我有一個列表,其文件名大致如下:Gadget1-010912000000-020912235959.csv,即它們包含兩個日期,指示其數據的時間跨度。從字符串中提取日期

用戶輸入一個日期格式和文件格式:在這種情況下

  • 文件格式:* GADGET * - * DATE_FROM * - 在這種情況下,* DATE_TO * .CSV
  • 日期格式:ddMMyyHHmmss

我想要做的是從給定文件和日期格式的文件名中提取三個值。

我的問題是:由於日期格式可能會有很大的不同(小時,分鐘和秒可以用冒號分隔,日期由點,...)我不知道如何創建一個適合的正則表達式。

+0

如果原來的日期格式不固定,這將是困難的,容易出錯。 – assylias

+0

你能舉出更多日期格式的例子嗎?最好的,如果它涵蓋了你所有的情況。 – nhahtdh

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

希望它有幫助。

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

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] 

在這裏您可以定義正則表達式和paranthesis標記組,以便([0-9]{2})標誌着一個組。然後是在這種情況下可能的分度符[\\.]* 0或1個點,但您可以放置​​更多可能的分度符,例如[\\.|\]{0,1}

然後運行matcher.find(),如果模式匹配,則返回true。然後使用matcher.group(int)你可以逐組。請注意,第一組的索引是1.

然後我使用StringBuilder構造乾淨日期String。然後解析日期。

乾杯, 米哈爾