2017-02-16 8 views
1

例文字列と一致するための効率的な正規表現:ジャワ - 日時

00000018.000f1b1f 0101559e木2016年5月19日午前0時24分14秒-05:00 [K ....

を。 ..望ましくない言葉を言います。

Thuのような指定はありません。スペースで区切ると常に3番目の文字列になります。文字列のどこにでも置くことができます。 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

あなたの正規表現はOKに見えますが、あなたは、単一のスペースと数字

(?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)