5

一連の文字列から日付やその他の一時的なエンティティを取得したいと考えていました。ほとんどのパーサーは限られた範囲の入力パターンを処理するため、JAVA で日付の文字列を解析せずにこれを行うことができます。しかし、入力は手動入力であり、ここではあいまいです。

入力は次のようになります。

9 月 12 日 |3 月中旬 |2013 年 9 月 12 日

9 月 12 日 | 9 月 12 日 | 2013年

2013 年 9 月 13 日 | 9 月 12 日 | 2 月 12 日

Javaで日付を見つけることについて多くの回答を経験しましたが、それらのほとんどは、そのような膨大な範囲の入力パターンを扱っていません。

SimpleDateFormatクラスを使用し、いくつかの parse() 関数を使用して、日付ではないことを意味する解析関数が壊れているかどうかを確認してみました。使用してみましregexたが、このシナリオに適合するかどうかはわかりません。また、 ClearNLPを使用して日付に注釈を付けましたが、信頼できる注釈セットは得られません。

これらの値を取得するための最も近い方法は、Chain of responsibility後述の a を使用することです。日付のパターンのセットを持つライブラリはありますか。私は多分それを使用することができますか?

4

5 に答える 5

2

この問題に対するクリーンでモジュール化されたアプローチは、チェーンを使用することです。チェーンのすべての要素は、正規表現が入力文字列と一致する場合、入力文字列を入力文字列をフィードできるものに変換できるよりも、正規表現に対して入力文字列を一致させようとします。 SimpleDateFormat を使用して、好みのデータ構造 (Date? またはニーズにより適した別の時間表現) に変換し、それを返します。正規表現がチェーン要素と一致しない場合は、チェーン内の次の要素に委任するだけです。

チェーンのすべての要素の責任は、正規表現を文字列に対してテストし、結果を与えるか、チェーンの次の要素に試してもらうことです。

チェーンは、チェーンのすべての要素の実装を変更することなく、簡単に作成および構成できます。

最終的に、結果は @KirkoR 応答と同じになり、「ビット」(:D) コードが増えますが、モジュラー アプローチになります。(try/catch よりも正規表現のアプローチを好みます)

参考文献: https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

于 2015-10-13T09:40:17.747 に答える
1

考えられるすべてのパターンの可能性に対するサポートを実装して、それを文書化するだけでよいのです。OK、これらはすべて私のモジュールがサポートするパターンです。RuntimeException次に、他のすべての可能性のためにいくつかをスローできます。

次に...反復的な方法で、入力データに対してモジュールを実行し続け、RuntimeException.

合理的にシンプルに保ちたい場合は、ここでできる最善の方法だと思います。

于 2015-10-13T09:14:20.540 に答える
1

はい!最後に、次のような一般的な日付/時間値をすべて抽出しました。

3月中旬 | 先月 | 9/11

次のように具体的に:

11/11/11 11:11:11

これは、GATEJAPEの素晴らしいライブラリのおかげで実現しました。

「2001 年 2 月 9 月 11 日または 11 日」のような特定の種類の日付を含めるために、JAPE で「DateEnhanced」というより寛大な注釈ルールを作成し 、「DateEnhanced」注釈の RHS で Java 正規表現のチェーンJAPE RULEを使用しました。不要な出力をフィルタリングします。

于 2015-10-15T13:35:32.953 に答える
0

残念ながら、洗練された問題の非常に優れた実装をお勧めします:http://koziolekweb.pl/2015/04/15/throw-to-taki-inny-return/

Google 翻訳を使用できます。

https://translate.google.pl/translate?sl=pl&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Fkoziolekweb.pl%2F2015%2F04%2F15%2Fthrow-to-taki- inny-return&edit-text=

そこのコードは本当に素敵に見えます:

private static Date convertStringToDate(String s) {                           
    if (s == null || s.trim().isEmpty()) return null;                         
    ArrayList<String> patterns = Lists.newArrayList(YYYY_MM_DD_T_HH_MM_SS_SSS,
            YYYY_MM_DD_T_HH_MM_SS                                             
            , YYYY_MM_DD_T_HH_MM                                              
            , YYYY_MM_DD);                                                    
    for (String pattern : patterns) {                                         
        try {                                                                 
            return new SimpleDateFormat(pattern).parse(s);                    
        } catch (ParseException e) {                                          
        }                                                                     
    }                                                                         
    return new Date(Long.valueOf(s));                                         
}
于 2015-10-13T09:27:21.273 に答える