0

このパターンを使用して、テキスト ファイルから確認日を抽出し、それらを日付オブジェクトに変換しています (こちらの投稿を参照してくださいMS Access の文字列から日付を抽出/変換します)。

現在のパターンは、日付のように見えるすべての文字列に一致しますが、確認日ではない可能性があり (常に Confirmed by が先行します)、さらに、完全な日付情報を持たない可能性があります (例: noAMまたはPM)。

 Pattern: (\d+/\d+/\d+\s+\d+:\d+:\d+\s+\w+|\d+-\w+-\d+\s+\d+:\d+:\d+)

サンプルテキスト:

WHEN COMPARED WITH RESULT OF 7/13/12 09:06:42  NO SIGNIFICANT 
CHANGE; Confirmed by SMITH, MD, JOHN (2242) on 7/14/2012 3:46:21 PM;

上記のパターンは次のものに一致します。

WHEN COMPARED WITH RESULT OF 7/13/12 09:06:42  NO SIGNIFICANT 
                             ^^^^^^^^^^^^^^^^^^^^
CHANGE; Confirmed by SMITH, MD, JOHN (2242) on 7/14/2012 3:46:21 PM;
                                               ^^^^^^^^^^^^^^^^^^^^

Confirmed by で始まり、セミコロンで終わるテキスト ファイルのセグメントで日付を検索するパターンが必要です。また、時刻を正しく変換するために、パターンは最後に AM または PM のみに一致する必要があります。パターンをこのセグメントに制限し、追加の AM または PM 条件を追加するにはどうすればよいですか?

誰でも助けることができますか?

4

4 に答える 4

2

文字列の最後に一致させるに$は、正規表現の最後で使用します。" " というフレーズ全体を照合するには、Confirmed by <someone> on <date>プレーン テキストを使用します (プレーン テキストは正規表現でも使用できることに注意してください。特殊文字を使用していない場合、マッチャーはクエリをそのまま照合します)。単語全体を除外するには、否定的な先読みを使用する必要があります。おそらく次のようなものです。

Confirmed by (?!\ on\ )(\d+/\d+/\d+\s+\d+:\d+:\d+\s+\w+|\d+-\w+-\d+\s+\d+:\d+:\d+)$

これにより、「Confirmed by」で始まり、その後に「 on 」以外の文字列が続き、その後にキャプチャした日付と文字列の末尾が続く文字列を照合できます。

編集: 否定的な先読み部分は注意が必要です。詳細については、以下の回答を参照してください。

単語/文字列を除外する正規表現

于 2012-07-27T21:30:10.990 に答える
1

ここでは、肯定的であろうと否定的であろうと、先読みの必要はないと思います。これは、サンプル文字列で正しく機能します。

Confirmed by [^;]*(\d+/\d+/\d+\s+\d+:\d+:\d+(?:\s+(?:AM|PM))?|\d+-\w+-\d+\s+\d+:\d+:\d+);

は、シーケンスとその終了セミコロン[^;]*の間の一致を効果的に囲い込みます。Confirmed by(セミコロンは常に存在すると仮定しています。)

+(?:\s+(?:AM|PM))?AM/PM とその先頭の空白をオプションにします。

実際の日付は、キャプチャ グループ #1 に格納されます。

于 2012-07-28T11:30:59.807 に答える
0

これを試して:

(\d+/\d+/\d+\s+\d+:\d+:\d+\s+(?:AM|PM));
于 2012-07-27T21:31:05.327 に答える
0

最も単純な答えは、多くの場合、十分な解決策です。デフォルトの貪欲な動作 (疑問符: を使用.*?) を無効にすることで、正規表現は代わりに、パターンに一致する最短の一致を見つけようとします。パターンが同じ文字列に 2 回以上一致することはありません。これは、それぞれConfirmed byが 1 つの日付 (この場合は次に続く日付) としか結合できないことを意味します。

Confirmed by.*?(\d+/\d+/\d+\s+\d+:\d+:\d+\s+(?:AM|PM));
于 2012-07-27T22:33:58.827 に答える