2010-07-21 97 views
1

我有這樣的樣本串:如何從此字符串解析出時間戳?

Sample string 1: 
A^1.1#B^1#I^2#f^0#p^1#d^2010-07-21T08:52:05.222ZKHBDGSLKHFBDSLKFGNIF#%$%^$#^$XLGCREWIGMEWCERG 

Sample string 2: 
A^1.1#B^1#f^0#p^1#d^2010-07-22T07:02:05.370ZREGHCOIMIYR$#^$#^$#^EWMGCOINNNNNNVVVRFGGYVJ667VTG 

所以,從這些字符串,我需要拿出時間戳:

2010-07-21T08:52:05.222 or 
2010-07-22T07:02:05.370 

基本上值b/w的d^ and Z

什麼最好(「最聰明」)的方式來做到這一點? substring(),正則表達式?

+0

這些例子看起來很像ISO8601格式,這可能會幫助您找到一個「內置」解析器。 – Freiheit 2010-07-21 19:29:07

+0

你能不能使用我的頭像? > _ < – 2010-07-21 20:03:01

+0

@pavel lol,np,我沒有看到你的頭像上有一個「版權」,所以拿了它。 :) – zengr 2010-07-21 21:44:20

回答

4
Pattern p = Pattern.compile("(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3})"); 
//you could also use "d\\^(.*)Z" as your regex patern 
Matcher m = p.matcher("your string here"); 

if (m.find()) { 
    System.out.println(m.group(1)); //print out the timestamp 
} 

here

兩者同時,一定要重用Pattern p對象,如果你通過一系列串

+0

因爲它總是在「d ^」和「Z」之間,所以只用d ^(。*?)Z和使用捕獲組是不是更容易? – NorthGuard 2010-07-21 19:29:02

+0

「d \\ ^(。*?)Z」也有效 – zengr 2010-07-21 19:36:44

+0

@ fy-tide啊,你說的沒錯。編輯顯示嚴格和簡單的正則表達式模式。 – sigint 2010-07-21 19:41:03

2

兩個小假設你可以不用正則表達式的循環。

  1. ^d正好在日期字符串之前是第一個出現在文本中的字符串。我認爲分隔符總是意味着「有日期。」
  2. 該日期格式看起來很規則,所以我假設長度不會改變。

剛剛得到起始^d分隔符的索引,找出日期的起始位置,並使用長度來得到結束索引。

public static void main(String[] args) { 
    String s1 = "A^1.1#B^1#I^2#f^0#p^1#d^2010-07-21T08:52:05.222ZKHBDGSLKHFBDSLKFGNIF#%$%^$#^$XLGCREWIGMEWCERG"; 
    String s2 = "A^1.1#B^1#f^0#p^1#d^2010-07-22T07:02:05.370ZREGHCOIMIYR$#^$#^$#^EWMGCOINNNNNNVVVRFGGYVJ667VTG"; 

    System.out.println(parseDate(s1)); 
    System.out.println(parseDate(s2)); 
} 

public static String parseDate(String s) { 
    int start = s.indexOf("d^") + 2; 
    int length = 23; 

    String date = s.substring(start, start + length); 
    return date; 
} 

輸出:

2010-07-21T08:52:05.222
2010-07-22T07:02:05.370

+0

好的,所以從良好的編程習慣,是不是假設一個字符串的長度不好? – zengr 2010-07-21 19:54:05

+1

@zengr:我必須假設它,因爲我只有2個樣本可供查看。你不應該假設它,你不應該。您應該能夠找出該日期格式是否爲固定長度。您接受的正則表達式也採用已知的格式。 – 2010-07-21 19:59:13

+0

@zengr:我會補充一點,如果你無法驗證這兩個假設對於任何輸入都是真的,你應該堅持使用正則表達式的解決方案。 – 2010-07-21 20:05:00

0

我會去與一個正則表達式,喜歡的事(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3})

您可能希望獲得更好的發現,並防止01-31之外的幾個月,01-31之外的時間等幾個小時,但它應該足夠好,就像您提供的樣本數據一樣。

如果日期總是以^ d爲前綴,子串可能會工作,但我仍然認爲正則表達式更清晰。