0

仕様で正式に定義されているRFC822 (SMTP)の「Received」行の要素を解析したい。

アトム = 1*

[...]

受け取った=「受け取った」「:」; リレーごとに 1 つ
                       [「から」のドメイン] ; 送信ホスト
                       [「ドメイン別」] ; 受信ホスト
                       [「アトム経由」] ; 物理パス
                      *("with" アトム) ; リンク/メールプロトコル
                       ["id" msg-id] ; 受信者のメッセージ ID
                       ["for" addr-仕様]; 初期形
                       ";" 日付時刻 ; 受け取った時間

[...]

msg-イド=「」; 一意のメッセージ ID

[...]

addr-spec = ローカル部分「@」ドメイン。グローバル アドレス

ドメイン、日時など

実際の例を次に示します。

受け取ったもの: ll-194.132.162.89.kv.sovam.net.ua (ll-194.132.162.89.kv.sovam.net.ua [83.170.243.194] (偽造されている可能性があります)) から raq2073.uk2.net (8.10. 2/8.10.2) <johnsmithsvt@matts.co.uk> の ESMTP ID lASHDDE10765 を使用。2007 年 11 月 28 日水曜日 17:13:13 GMT

正規表現は、受信した行の一部をキャプチャするための優れた戦略でしょうか?

多くの SMTP サーバーが受信した行を適切にフォーマットしていないことを認識しています (実際には)。

それ以外の場合、これをうまく行うJavaのライブラリを知っている人はいますか?

編集これは、私がしばらく試した正規表現とテストを示すフィドルです。これは機能しているようです。

Received:\s+(?:from\s+(.+?))?(?:\(qmail (.+?)\))?(?:\s+by\s+(.+?))?(?:\\s+via\s+(.+?))?(?:\s+with\s+(.+?))?(?:\;?\s+id\s+(.+?))?(?:\s+for\s+(.+?))?(?:;\s*(?!.*\;.*)(.+))?$
4

1 に答える 1

1

どちらを選択するかは、実際に何を達成したいかによって異なります。

レシーバーラインの特定の部分をキャプチャする場合(たとえば、「From-part」を教えてください)、正規表現は素晴らしいです。

この文法に本格的なパーサーが必要な場合は、正規表現だけでは不十分です。特に、addr-specには非常に多くの特殊なケースがあるため、正規表現はそれぞれを正しく処理することを期待できません(説明)。正規表現はパーサーではありません。

前回実際のパーサーが必要だったときは、 JavaCCを使用して自分で作成しました。文法と構文解析について1つか2つ知っている場合にのみ、その道を進むことをお勧めします。

于 2012-04-28T23:43:27.583 に答える