62

私は最近、標準のすべてのバリエーションと可能性を考慮して、電子メールアドレスに一致する正規表現を書くことは非常に難しく、最初に想定するよりもはるかに複雑であるとどこかで読みました。

何故ですか?

実際にこれを完全に行う既知の証明された正規表現はありますか?

電子メール アドレスの照合に正規表現を使用する代わりに、どのような方法がありますか?

4

19 に答える 19

65

正式な電子メール仕様については、はい、コメントのようなものの再帰 (特に最初に空白へのコメントを削除しない場合)、およびさまざまな異なる形式 (電子メール アドレスは常にsomeone@somewhere.tldとは限りません)。(いくつかの大規模で理解できない正規表現パターンを使用して) 近づくことはできますが、電子メールをチェックするはるかに優れた方法は、非常によく知られているハンドシェイクを行うことです。

  • 彼らはあなたに彼らの電子メールを伝えます
  • Guid 付きの確認リンクを電子メールで送信します。
  • リンクをクリックすると、次のことがわかります。

    1. メールは正しい
    2. それが存在します
    3. 彼らはそれを所有しています

電子メールアドレスをやみくもに受け入れるよりもはるかに優れています。

于 2008-10-01T06:26:38.853 に答える
22

これを行う Perl モジュール (たとえば) がいくつかあります。それを行うために独自の正規表現を作成しようとしないでください。見る

Mail::VRFY構文とネットワークのチェックを行います (SMTP サーバーはどこかでこのアドレスを受け入れます)

https://metacpan.org/pod/Mail::VRFY

RFC::RFC822::Address- 再帰降下の電子メール アドレス パーサー。

https://metacpan.org/pod/RFC::RFC822::アドレス

Mail::RFC822::Address- 正規表現ベースのアドレス検証。非常識な正規表現を見るだけでも価値があります

http://ex-parrot.com/~pdw/Mail-RFC822-Address.html

他の言語にも同様のツールがあります。以下の非常識な正規表現...

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)
于 2008-10-01T06:34:49.803 に答える
11

いずれにしても、電子メール アドレスの検証はあまり役に立ちません。一般的なタイプミスや架空の電子メール アドレスは、構文的に有効なアドレスのように見える傾向があるため、検出されません。

アドレスが有効であることを確認したい場合は、確認メールを送信するしかありません。

ユーザーが単なる「asdf」ではなく電子メールのように見える何かを入力したことを確認したい場合は、@ を確認してください。より複雑な検証は、実際には何のメリットもありません。

(これがあなたの質問に答えていないことはわかっていますが、とにかく言及する価値があると思います)

于 2008-10-01T08:38:02.347 に答える
8

BNF には、RFC-2822で有効な電子メール アドレスを記述する文脈自由文法があります。複雑です。例えば:

" @ "@example.com

は有効な電子メール アドレスです。それを完全に行う正規表現は知りません。通常の例では、最初にコメントを削除する必要があります。私は再帰降下パーサーを書いて、それを一度に完全に実行しました。

于 2008-10-01T06:28:42.127 に答える
8

Cal Henderson、Dave Child、Phil Haack、Doug Lovell、および RFC 3696 のテスト ケースを照合しました。全部で 158 のテスト アドレスがあります。

これらすべてのテストを、見つけたすべてのバリデーターに対して実行しました。比較はこちら: http://www.dominicsayers.com/isemail

人々がバリデーターを強化するにつれて、このページを最新の状態に保つように努めます。Cal、Dave、Phil には、これらのテストのコンパイルと、私自身のバリデーターに対する建設的な批判の助けと協力に感謝します。

特にRFC 3696 に対する正誤表に注意する必要があります。標準的な例のうち 3 つは、実際には無効なアドレスです。また、アドレスの最大長は320文字ではなく、254 または 256 文字です。

于 2009-02-10T16:16:08.230 に答える
7

「+」などの文字を許可することは、 myemail+sketchysite@gmail.com (インスタント使い捨て Gmail アドレス)などのスパムと戦うユーザーにとって非常に役立つため、すべてが無意味というわけではありません。

ただし、サイトがそれを受け入れる場合のみ。

于 2008-10-01T07:27:57.070 に答える
6

私の意見では、奇妙で一般的でない電子メール アドレス形式を受け入れるかどうかは、その形式をどうしたいかによると思います。

メールサーバーを作成している場合は、受け入れる内容を非常に正確かつ耐え難いほど正確にする必要があります。したがって、上で引用した「常軌を逸した」正規表現は適切です。

しかし、それ以外の場合は、ユーザーが Web フォームに入力する内容が適切に表示され、何らかの SQL インジェクションやバッファ オーバーフローが発生しないようにすることが主な目的です。

率直に言って、誰かがメーリング リスト、ニュースレター、または Web サイトにサインアップするときに、コメント、改行、引用符、スペース、括弧、またはその他の意味不明な文字を含む 200 文字の電子メール アドレスを入力することを気にする人がいるでしょうか? そのような道化師への適切な対応は、「username@domain.tld のようなアドレスを取得したら、後で戻ってきてください」です。

私が行う検証は、「@」が 1 つだけであることを確認することから成ります。スペース、ヌル、または改行がないこと。「@」の右側の部分に少なくとも 1 つのドットがある (ただし、2 つのドットが連続していない)。また、引用符、括弧、コンマ、コロン、感嘆符、セミコロン、またはバックスラッシュが含まれていないことを確認してください。これらはすべて、実際の電子メール アドレスの一部よりもハッキングの試みである可能性が高くなります。

はい、これは、誰かが私の Web サイトに登録しようとする可能性のある有効なアドレスを拒否していることを意味します。おそらく、実際のアドレスの 0.001% を「誤って」拒否しているのです! 私はそれで暮らすことができます。

于 2008-10-03T16:13:18.550 に答える
4

RFC の引用やその他のめったに使用されないが有効な部分は、それを困難にします。私はこのトピックについて、「難しい」以外に明確にコメントするのに十分な知識はありませんが、幸いなことに、他の人がそれについて詳しく書いています.

有効な正規表現に関しては、Perl Mail::Rfc822::Address モジュールには明らかに機能する正規表現が含まれていますが、コメントが既に空白に置き換えられている場合に限ります。(メールアドレスにコメント?予想以上に難しい理由がわかります...)

もちろん、他の場所にある単純化された正規表現は、実際に使用されているほとんどすべての電子メール アドレスを検証します...

于 2008-10-01T06:35:08.257 に答える
3

Javaで電子メールアドレスを確認する簡単で良い方法は、 ApacheCommonsValidatorライブラリのEmailValidatorを使用することです。

私は、メールを送信する前に、入力フォームのメールアドレスをこのようなものと常に照合します。タイプミスを見つけた場合でも同様です。「配信に失敗した」通知メール用の自動スキャナーを作成したくない場合があります。:-)

于 2009-01-06T20:22:48.973 に答える
3

正規表現のいくつかのフレーバーは、ネストされたブラケット (Perl 互換のものなど) と実際に一致します。そうは言っても、RFC 822 に正しく一致すると主張する正規表現を見たことがありますが、それは空白のない 2 ページのテキストでした。したがって、有効な電子メール アドレスを検出する最善の方法は、そのアドレスに電子メールを送信し、それが機能するかどうかを確認することです。

于 2008-10-01T06:28:55.043 に答える
3

@mmaibaum によってリストされたものよりもクレイジーではない正規表現を追加するだけです。

^[a-zA-Z]([.]?([a-zA-Z0-9_-]+)*)?@([a-zA-Z0-9\-_]+\.)+[a-zA-Z]{2,4}$ 

これは絶対的なものではなく、確かに電子メールの仕様全体をカバーしているわけではありませんが、ほとんどの基本的な要件をカバーする適切な仕事をしています. さらに良いことに、ある程度わかりやすく、編集することもできます。

世界クラスの ColdFusion リソースであるHouseOfFusion.comでのディスカッションから引用しました。

于 2008-10-03T15:46:26.577 に答える
2

Email Spec, RFC 2822によると、電子メールアドレスには有効なことがたくさんあるので、それは本当に難しいです. + など、通常は表示されないものは、仕様によると、電子メール アドレスとして完全に有効な文字です。

メールアドレス専用のセクション全体がありますhttp://regexlib.comは、優れたリソースです。自分にとって重要な基準を判断し、一致する基準を見つけることをお勧めします。ほとんどの人は、仕様で許可されているすべての可能性を完全にサポートする必要はありません。

于 2008-10-01T06:29:51.123 に答える
2

.NET Framework で実行している場合は、MailAddressオブジェクトをインスタンス化して、失敗した場合はキャッチするか、成功FormatExceptionした場合は取り出してみてください。Address例外をキャッチするパフォーマンスについてナンセンスにならないように (実際、これが 1 つの Web フォーム上にあるだけであれば、それほど大きな違いはありません) MailAddress、.NET フレームワークのクラスは完全な解析プロセスを実行します。 (正規表現は使用しません)。Reflector を開いて検索しMailAddress、機能MailBnfHelper.ReadMailAddress()をすべて確認してください。私より頭のいい人が Microsoft でそのパーサーを構築するのに多くの時間を費やしました。実際にそのアドレスに電子メールを送信するときに使用する予定なので、受信アドレスの検証にも使用する可能性があります。

于 2009-12-31T15:08:07.953 に答える
1

これを試してください:

"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"

詳細はこちらをご覧ください。

ただ、RFC822規格をそのまま実装するよりも、別の視点から見たほうがいいのではないでしょうか。メールサーバーが標準を反映していない場合、標準が何を言っているかは問題ではありません。したがって、電子メール アドレスを検証する際に、最も一般的なメール サーバーが行うことを模倣する方がよいと私は主張します。

于 2008-10-01T06:29:41.890 に答える
1

多くの人が試し、多くの人がそれに近づいています。ウィキペディアの記事その他 記事を読みたいと思うかもしれません。

具体的には、多くの Web サイトや電子メール サーバーが電子メール アドレスの検証を緩和しているため、基本的に標準を完全に実装していないことに注意してください。ただし、電子メールが常に機能するのには十分です。

于 2008-10-01T06:37:28.827 に答える
1

Java 用のこのクラスにはバリデーターがあります: http://www.leshazlewood.com/?p=23

これは、Shiro の作成者 (正式には Ki、正式には JSecurity) によって書かれています。

電子メール アドレスの有効性をテストすることの長所と短所:

電子メールを検証する正規表現には、次の 2 種類があります。

  1. ゆるすぎるもの。
  2. 厳しすぎるもの。

一部の文字列は有効な電子メール アドレスのように見えても、実際には誰の受信トレイにも届かない可能性があるため、正規表現がすべての有効な電子メール アドレスに一致し、無効な電子メール アドレスがまったく一致しないということはありません。電子メールが実際に有効かどうかをテストする唯一の方法は、そのアドレスに電子メールを送信し、何らかの応答があるかどうかを確認することです。そのことを念頭に置いて、電子メールの照合に厳しすぎる正規表現は、実際にはあまり目的を持っていないようです。

電子メールの正規表現を求めるほとんどの人は、最初のオプションである緩すぎる正規表現を探していると思います。彼らは文字列をテストして、それが電子メールのように見えるかどうかを確認したいと考えており、それが明らかに電子メールではない場合、ユーザーに次のように言うことができます。有効な電子メールではありません。おそらく、このフィールドが電子メール用であることを認識していないか、入力ミスがある可能性があります。」

ユーザーが有効な電子メールによく似た文字列を入力したが、実際には電子メールではない場合、それはアプリケーションの別の部分で処理する必要がある問題です。

于 2010-03-11T08:00:03.490 に答える
0

この記事を完全なものにするために、PHP にも電子メールを検証する言語組み込み関数があります。

PHP の場合、特定の EMAIL 検証タイプで素敵な filter_var を使用します:)

PHP での非常識なメール正規表現はもう必要ありません :D

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));

http://www.php.net/filter_var

于 2008-10-01T09:10:08.773 に答える
0

それがなぜなのかについて、誰かが洞察を提供できますか?

はい、今日誰も実際に使用していない多くのものを許可する非常に複雑な標準です。:)

実際にこれを完全に行う既知の証明された正規表現はありますか?

ここでは、標準全体を完全に解析する 1 つの試みを示します...

http://ex-parrot.com/~pdw/Mail-RFC822-Address.html

電子メール アドレスの照合に正規表現を使用する代わりに、どのような方法がありますか?

使用している言語に関係なく、既存のフレームワークを使用していると思いますか? それらはおそらく内部で正規表現を使用しますが。複雑な文字列です。正規表現は複雑な文字列を解析するように設計されているため、これが最適な選択です。

編集:私がリンクした正規表現はただの楽しみのためだったことを追加する必要があります。私はそのような複雑な正規表現を使用することを推奨しません。「正規表現が複数行の場合、どこかにバグがあることが保証されている」と言う人もいます。標準がいかに複雑であるかを説明するためにリンクしました。

于 2008-10-01T06:28:17.120 に答える