簡體   English   中英

從字符串中提取日期

[英]Extracting dates from string

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

用戶輸入日期格式和文件格式:

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

我要執行的操作是使用給定的文件和日期格式從文件名中提取三個值。

我的問題是:由於日期格式可能相差很大(小時,分鍾和秒可以用冒號分隔,日期可以用點分隔...),我不太了解如何創建合適的正則表達式。

您可以使用正則表達式刪除非數字字符,然后解析值。

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]

在這里,您可以定義正則表達式並在括號中標記組,以便([0-9]{2})標記組。 然后是可能的分隔符[\\\\.]*表達式,在這種情況下為0或1點,但是您可以放置​​更多可能的分隔符,例如[\\\\.|\\]{0,1}

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

然后,我使用StringBuilder構造干凈的日期String 然后解析日期。

干杯,米哈爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM