0

長い文字列から日付を解析できる Java ルーチンを作成しようとしています。つまり、次の文字列が与えられます。

"Please have the report to me by 6/15, because the shipment comes in on 6/18" 

正規表現は 6/15 と 6/18 の両方を検出します。私は Stack Overflow などを見てきましたが、日付正規表現のほとんどの例は、大量のテキスト内で日付を見つけるのではなく、指定された文字列が日付であるかどうかを単純に検証するものです。理想的には、人々が日付を数字で書く主な方法、つまり6/15, 6/15/12, 06/15/12,15/6/12をすべて識別できる正規表現が必要です15/06/12が、cla. 私は正規表現を初めて使用します(2日前に学習を始めたばかりです)。正規表現はまだ少しわかりにくいので、正規表現の提案の詳細な説明をいただければ幸いです。

4

3 に答える 3

2

範囲チェックを気にしない場合は、これで十分です。

(\d{1,2})/(\d{1,2})(?:/(\d{4}|\d{2}))?

できない2/29/2001ができることを確認する2/29/2000には、正規表現がその仕事を終えた後に本当にやりたいと思っています。そうしないと、亡命することになります。

編集:さらに良いことに、世紀を分離し、2/193 のようなものから保護します (別の問題ですが、アレックスの質問によって促されました):

\b(\d{1,2})/(\d{1,2})(?:/(\d{2})?(\d{2}))?\b

[month, day, century, year]各一致で4 つのキャプチャを取得しcenturyますyear

于 2012-06-18T18:11:49.557 に答える
0
\d{1,2}/\d{1,2}(?:/(?:\d{2}){1,2})?

内訳は次のとおりです。

  • \d{1,2}1桁または1桁に一致
  • / 続いて/
  • \d{1,2}さらに1桁または2桁続いた
  • (?:/(?:\d{2}){1,2})?オプションのスラッシュと 2 桁または 4 桁の年が続きます

一致から、すべての検証ルールを正規表現に入れようとするのではなく、Java DateParse を使用してそれらを解析することをお勧めします。

分数からも保護したい場合があります。これは、正規表現1/4th に否定先読みを追加することで実行できます。(?!th|rd|nd)これによりth、 、rd、またはnd.

于 2012-06-18T18:14:09.090 に答える
0

あなたの質問は正確には何ですか?最初に正規表現に関するガイドを読む必要があります。

次のように、文字列内のすべての一致を返すメソッドが必要です。p は正規表現、text はテキストです。

private LinkedList<String> matches(String p, String text) {
    LinkedList<String> results = new LinkedList<String>();

    Pattern pattern = Pattern.compile(p);
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        results.add(matcher.group());
    }

    return results;
}

| で各日付パターンを区切ることができます。

正規表現の一部を中かっこ (...) に入れると、この部分は「グループ」として扱われます。したがって、一致する文字列から単一の数値を抽出できます (必要な場合)。

于 2012-06-18T18:26:17.587 に答える