0

仕事用のメールのデータ ダンプがテキスト ファイルにあり、正規表現を使用してメールの内容を抽出したいと考えています。

現時点では、元の要求者をデータから削除しようとしています。電子メールの元の作成者は常に自分の名前に対してタイム スタンプを持っていますが、cc された人はそうではありません。

本質的に、メールは次のようになります

ジョン・スミス (XYZ RE) (M/DD/YYYY HH:MM PM):

John Smith (XYZ RE) の電子メール形式は、別の人物の電子メールのさらに下に再び表示されます。

メールを取得するためにこの洗練されていない正規表現を作成しました(機能するので、十分に満足しており、どちらがより重要であるかを理解しています)

([^\s]+\s+[^\s]+\s+[(]+[A-Z]+\s+[A-Z]+[)])

日付を取得するために同様のことも試しましたが、これは一部の日付では機能し、他の日付では失敗します

([^\s][0-9]+[/]+[0-9]+[/]+[0-9]+\s+[0-9][:][0-9]+\s+(AM|PM)[)][:])

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

私は正規表現の初心者であり、時間があればメモ帳++を使用してテストし、Javaベースのアプリケーションを使用して実行する場合は、ウォークスルーもいただければ幸いです

ありがとうジョン

4

3 に答える 3

3

これらすべての角括弧は必要ありません。文字クラスを使用すれば十分です。

日付/時刻の正規表現には、次のようなものを使用します。

'\(\d+\/\d+\/\d+\s\d+:\d+ (AM|PM)\):'

\dに似ています[0-9]-短い:)

ブラケットをエスケープする必要があることに注意してください。エスケープしないと、グループ キャプチャを意味する正規表現の一部になります。

括弧で囲まれた正規表現パターンに何かがある()ということは、それらの括弧内に一致するものはすべて「キャプチャ」されることを意味します (後で使用するために変数に格納されます)。大きなテキストを扱っていて、一致した文字列にアクセスする必要がない場合 (たとえば、置換などのみ)、次?:のように括弧を追加することでキャプチャを回避できます。

'\(\d+\/\d+\/\d+\s\d+:\d+ (?:AM|PM)\):'
                           ^^

AMこれは、一致した文字や変数に保存されませんPM。つまり、大きなテキストのパフォーマンスがわずかに向上します:)

于 2013-08-21T14:39:32.013 に答える
1

見たところ、 が1 つ欠けているだけです。+これにより、一致が 1 桁の時間フィールドを持つ日付に制限されます。

([^\s][0-9]+[/]+[0-9]+[/]+[0-9]+\s+[0-9]+[:][0-9]+\s+(AM|PM)[)][:])
                                        ^

[^\s]\S[0-9]置き換えることで正規表現を単純化できます\dが、これは 1 回限りの使用のように聞こえるため、読みやすいと思われるものの方がおそらく適切です。これらの置換はどちらも必要ありません。それらは単なるショートカットです。

(また、「AM」または「PM」をキャプチャーする代わりに、グループをキャプチャーせずに、A または P の後に M が続くものに一致する に置き換えることもできます。(AM|PM))[AP]M

于 2013-08-21T14:40:21.487 に答える
0

あなたの日付のためにこれを使ってみてください: /^(1[0-2]|0[1-9])\/(3[01]|[12][0-9]|0[1-9])\/[0-9]{4} ([0-2][0-9]\:[0-5][0-9]) (AM|PM)$/

于 2013-08-21T14:40:43.710 に答える