2016-03-17 24 views
9

文字列をLocalDateに解析する必要があります。文字列は正規表現で31.* 03 2016のようになります(つまり、.*は、日の後に0文字以上の未知の文字がある可能性があることを意味します)。DateTimeFormatterのワイルドカード

例入力/出力:31xy 03 2016 ==>2016-03-31

私は、次のようなパターン可能にしてDateTimeFormatterドキュメントでワイルドカード構文を見つけることを期待していた。

LocalDate.parse("31xy 03 2016", DateTimeFormatter.ofPattern("dd[.*] MM yyyy")); 

を、私は何かを見つけることができませんでした。

DateTimeFormatterでオプションの不明な文字を簡単に表現する方法はありますか?

ps:解析する前に明らかに文字列を変更できますが、それは私が求めているものではありません。

+0

'DateTimeFormatter'に渡す前に文字列を前処理したくない理由はありますか?あなたができることは、 'DateTimeFormatter'を拡張し、' ofPattern() 'メソッドをオーバーライドする独自のクラスを作成することですが、これはお勧めできません。 –

+0

私は、DateTimeFormatterで洗練されたソリューションを好むでしょう - それが存在しない場合、私は計画Bに行くでしょう。DateTimeFormatterは最終的なので、拡張可能ではありません。 – assylias

+0

ああ知りませんでした、知っておいてよかった! –

答えて

5

java.timeに直接的なサポートはありません。

最も近いのは、parse(CharSequence,ParsePosition)という2つの異なるフォーマッタを使用することです。

// create the formatter for the first half 
DateTimeFormatter a = DateTimeFormatter.ofPattern("dd") 

// setup a ParsePosition to keep track of where we are in the parse 
ParsePosition pp = new ParsePosition(); 

// parse the date, which will update the index in the ParsePosition 
String str = "31xy 03 2016"; 
int dom = a.parse(str, pp).get(DAY_OF_MONTH); 

// some logic to skip the messy 'xy' part 
// logic must update the ParsePosition to the start of the month section 
pp.setIndex(???) 

// use the parsed day-of-month in the formatter for the month and year 
DateTimeFormatter b = DateTimeFormatter.ofPattern("MM yyyy") 
    .parseDefaulting(DAY_OF_MONTH, dom); 

// parse the date, using the *same* ParsePosition 
LocalDate date = b.parse(str, pp).query(LocalDate::from); 

上記はテストされていませんが、基本的に動作するはずです。ただし、手動で解析するほうがはるかに簡単です。

+0

解析できない文字をスキップする「寛大な」パーサーですか? (LENIENTリゾルバスタイルを使用しても動作しません) – assylias

2

私は、二つのステップでそれを行うLOCALDATEが解析できるものに元の文字列を取得するために正規表現を使用して、たとえばたい:

String dateSource = "31xy 03 2016"; 
String normalizedDate = dateSource.replaceFirst("^(\\d+).*? (\\d+ \\d+)", "$1 $2"); 
LocalDate date = LocalDate.parse(normalizedDate, DateTimeFormatter.ofPattern("dd MM yyyy")); 
System.out.println(date); 

私はそれはあなたが尋ねたものではないことを知っています。

+1

いつでもあなたが望むものを得ることはできません。しかし、時々試してみると、あなたが必要とするものを手に入れることができるかもしれません。 –