質問

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

その理由について誰かが洞察を提供できますか?

実際にこれを完全に実行する既知の実証済みの正規表現はありますか?

電子メール アドレスを照合するために正規表現を使用する代わりに何か良い方法はありますか?

役に立ちましたか?

解決

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

  • 彼らはあなたのメールを教えてくれます
  • ガイドに確認リンクをメールで送信します
  • 彼らが知っているリンクをクリックすると:

    1. 電子メールが正しい
    2. 存在する
    3. 所有している

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

他のヒント

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

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

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

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

https://metacpan.org/pod/RFC::RFC822::Address

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*)

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

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

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

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

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

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

人々がバリデータを強化するにつれて、このページを最新に保つようにします。これらのテストのコンパイルと自分のバリデータ

特に RFC 3696に対するエラッタに注意する必要があります。 。正規の例のうち3つは、実際には無効なアドレスです。また、住所の最大長は254または256文字で、 320ではありません

「+」などの文字を許可することは、スパムと闘うユーザーにとって非常に便利です。 myemail+sketchysite@gmail.com インスタントの使い捨てGmailアドレス)。

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

BNFには、 RFC-2822 。複雑です。例:

" @ "@example.com

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

奇妙で珍しいメールアドレスの形式を受け入れるかどうかは、私の意見では、それをどうしたいかによって決まります。

メールサーバーを作成する場合は、受け入れる内容を非常に正確かつ耐え難いほど正確にする必要があります。 <!> quot; insane <!> quot;したがって、上記の正規表現が適切です。

しかし、私たちは主に、ユーザーがWebフォームに入力するものが合理的で、何らかのSQLインジェクションやバッファオーバーフローが発生しないようにすることに主に興味があります。

率直に言って、メーリングリスト、ニュースレター、またはWebサイトにサインアップするときに、コメント、改行、引用符、スペース、括弧、またはその他の意味のない200文字のメールアドレスを誰かに入力させたいと思う人はいますか?そのような道化師への適切な応答は、<!> quot; username@domain.tld <!> quot;のようなアドレスがあるときに戻ってきます。

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

はい、これは誰かが私のウェブサイトに登録しようとする可能性のある有効なアドレスを拒否していることを意味します-おそらく<!> quot;誤って<!> quot;実世界のアドレスの0.001%を拒否します!私はそれで生きることができます。

クォーティングおよびその他のめったに使用されないが、RFCの有効な部分は困難です。 <!> quot;それは難しい<!> quot;を除いて、このトピックについて明確にコメントするほど十分には知りません。 -幸いなことに他の人が書かれている詳細については

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

もちろん、他の場所にある簡略化された正規表現は、本当に使用されているほぼすべての電子メールアドレスを検証します...

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

@mmaibaumでリストされているものよりも狂気の少ない正規表現を追加するだけです:

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

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

ワールドクラスのColdFusionリソースである HouseOfFusion.com のディスカッションから引用。

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

メールを送信する前に、入力フォームのメールアドレスを常にこのようなものと照合します-いくつかのタイプミスを見つけたとしても。 <!> quot; delivery failed <!> quot;の自動スキャナーを作成したくないでしょう。通知メール。 :-)

メールの仕様 RFC 2822 。 +など、通常は表示されないものは、電子メールアドレスに完全に有効な文字です。仕様に従って。

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

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

多くの人が試しましたが、多くの人が近づいてきました。 ウィキペディアの記事、および一部 その他

具体的には、多くのウェブサイトとメールサーバーがメールアドレスの検証を緩和しているため、基本的に標準を完全に実装していないことを覚えておく必要があります。ただし、電子メールが常に機能するのは十分です。

これを試してください:

"(?:[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標準を実装するのではなく、別の観点から見た方が良いかもしれません。メールサーバーが標準を反映していない場合、標準が何を言っているかは実際には関係ありません。だから、私は、メールアドレスを検証するときに最も人気のあるメールサーバーが何をするかを模倣する方が良いと主張します。

このJavaのクラスには、バリデーターが含まれています。 http://www.leshazlewood.com/?p=23

これはShiro(正式にはKi、正式にはJSecurity)の作成者によって作成されました

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

電子メールを検証する正規表現には2つのタイプがあります:

  1. 緩すぎるもの。
  2. 厳格すぎるもの

一部の文字列は有効な電子メールアドレスのように見えても、実際にはだれの受信トレイにも移動しないため、正規表現がすべての有効な電子メールアドレスに一致し、無効な電子メールアドレスに一致することはできません。電子メールが実際に有効であるかどうかを確認する唯一の方法は、そのアドレスに電子メールを送信し、何らかの応答を受け取るかどうかを確認することです。それを念頭に置いて、電子メールのマッチングが厳しすぎる正規表現には、実際には多くの目的がないようです。

電子メールの正規表現を求めるほとんどの人は、最初のオプションである緩すぎる正規表現を探していると思います。彼らは文字列をテストし、それが電子メールのように見えるかどうかを確認し、それが間違いなく電子メールではない場合、ユーザーに言うことができます:<!> quot;ねえ、あなたはここに電子メールを置くことになっていますこれは間違いなく有効なメールではありません。おそらく、このフィールドが電子メール用であることや、タイプミスがあるかもしれないことに気付いていなかったかもしれません<!> quot;。

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

誰がその理由について何らかの洞察を提供できますか?

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

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

標準全体を完全に解析する試みが1つあります...

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

一致するメールアドレスに正規表現を使用するのに適した代替手段は何ですか?

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

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

ウェインの回答に加えて、のセクションもあります。 www.regular-expressions.info いくつかのサンプルとともに、電子メール専用です。

それが価値があるかどうか、または実際に100%未満の正規表現をカバーする any が誤った安心感の原因となるかどうかはいつでも質問できます。

最終的には、実際に最終的な検証が行われるのは、実際には送信です。 (-メールサーバーにバグがあるかどうかがわかります;-)

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

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

PHPでこれ以上正気でないメール正規表現:D

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

http://www.php.net/filter_var

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top