2017-02-16 57 views
1

例字符串:爪哇 - 高效的正則表達式匹配的日期和時間

00000018.000f1b1f 0101559e星期四2016年5月19日○時24分14秒-05:00 [K ....

。 ..提到不需要的詞語。

沒有像Thu這樣的規範,如果用空格分隔,總是第三個字符串。它可以在字符串中的任何地方。我想匹配Thu May 19 2016 00:24:14 -05:00並與simpedateformat類分析。

我想到了一些正則表達式像.*?((sun|mon|tue|wed|thu|fri|sat)\s* (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{0,2}\s+\d{0,4}\s+\d{0,2}\:\d{0,2}\:\d{0,2}\s+([+|-]\d{0,2}:\d{0,2})?).*?

我不擅長的正則表達式。請幫助我改進我的正則表達式,該類可以通過simpledateformat類輕鬆解析。 -05:00是可選的。

有什麼建議嗎?

+0

你的表情看起來好像沒什麼問題。只需將[+ | - ]'替換爲[+ - ]'。無需轉義':'。如果你使用'matcher.find',則不需要在開始/結束時使用'。*?'。 –

+0

@WiktorStribiżew是的當然。我將使用'matcher.find'。我將避免並將包括大小寫不敏感的標誌。謝謝。 –

回答

1

您正則表達式看起來不錯,但你可以通過限制搜索單個空格提高性能和數字

(?i)\b((sun|mon|tue|wed|thu|fri|sat) (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) \d{1,2} \d{4} \d{2}\:\d{2}\:\d{2}([+|-]\d{2}:\d{2})?)

固定的號碼,然後你可以在一個循環中搜索就可以了(while (matcher.find()) ...

請記住,日期格式取決於應用程序語言環境。預計某種格式會使你的應用程序變得脆弱。

+0

感謝您的固定長度改進。 –

1

如果你不希望使用正則表達式,那麼你可以依靠的事實,賽後的SimpleDateFormat會忽略的東西,所以下面將工作

String in = "00000018.000f1b1f 0101559e 2016/12/14 12:34 [k...."; 

    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm"); 

    while (in.length() > 0) 
    try { 
     System.out.println(df.parse(in)); 
     break; 
    } 
    catch (Exception ee) { 
     in = in.substring(1); 
    } 

注意

中當然將上面的面具改爲所需的面具

+0

這正是代碼所做的。注意'break' –

+0

我必須使用正則表達式。它做到了預期的事情。謝謝 –

+0

正常處理期間依靠異常是不好的做法。過去拋出異常是一項非常昂貴的操作。現在它得到了改進,但沒有達到可以忽略的程度。 – rustyx

0

您是否需要支持所有3種日期格式? 即:如果您使用不區分大小寫的標誌

dd.mm.yyyy - European (day-of-month, month, year) 
mm/dd/yyyy - US (month, day-of-month, year) 
yyyy-mm-dd - Scandinevian (year, month, day-of-month)