メールアドレスを検索または確認する方法

「エラー」はもちろんのこと、レビューの最大数は、正規表現の電子メールアドレスに送られてきました。

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4}\b
      
      



私は、この正規表現が任意の電子メールアドレスを定義していると主張しています。 通常、フィードバックには、この表現に合わない1つの電子メールアドレスが表示されます。 また、バグレポートは完璧な正規表現の作成を示唆しています。



以下で説明するように、有効なメールアドレスとそうでないものの定義を受け入れた場合、私の声明は真実です。 別の定義を使用する場合は、式を調整する必要があります。 有効なメールアドレスを決定することは、それを示す素晴らしい例です



私の正規表現の威厳は、今日使用されている電子メールアドレスの99%を定義していることです。 受信したアドレスはすべて、99%の電子メールプログラムで処理できます。 簡単な解決策を探している場合は、次の段落を読むだけで済みます。



上記の正規表現を使用する場合、2つのことを理解する必要があります。 まず、大きな正規表現により、段落を適切にフォーマットすることが難しくなります。 したがって、3つの文字クラスのいずれにも「 az 」を使用しません。 これを行うには、プログラムの設定でレジスタをチェックするオプションを無効にする必要があります。 (これについて「エラー」の報告がいくつあるか驚くでしょう。)次に、上記の正規表現は単語の境界で区切られているため、ファイルまたは大きなテキストブロックから電子メールアドレスを抽出するのに適しています。 ユーザーが入力したテキストが有効なメールアドレスかどうかを確認する場合は、次のように、単語の区切り文字を行の先頭と末尾のアンカーに置き換えます。

 ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4}$
      
      





メール確認のトレードオフ



はい、正規表現では見つけられないメールアドレスがたくさんあります。 最も引用されているアドレスは、許可されている4文字より長い.museumトップレベルドメインを持つアドレスです。 このトップレベルドメインを使用している人の数は非常に少ないため、この妥協を受け入れます。 会社のウェブサイトでの注文フォームやニュースレターの購読が.museumのアドレスの使用を拒否したという苦情を受け取ったことはありません。



.museumを有効にするには、次の式を使用できます。

 ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,6}$
      
      



しかし、これは別の妥協案です。 この式はアドレスjohn@mail.officeを見つけます。 Johnは、ICANNの許可なしに.officeトップレベルドメインを作成したよりも、アドレスの末尾に.comを含めるのを忘れた可能性がはるかに高くなります。



上記の例は別のトレードオフを示しています:最上位ドメインが存在するかどうかを正規表現で確認しますか? 私の正規表現はそうではありません。 2〜4文字の任意の組み合わせは、.museum [および.travel- 約を除くすべての既存の(および計画されている)トップレベルドメインをカバーします。 あたり ]しかし、 asdf @ asdf.asdfという形式の無効な電子メールアドレスを判別します。 トップレベルドメインに極端に厳しいことなく、次のドメインが作成されるたびに正規表現を更新する必要はありません。



 ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.(?:[AZ]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$
      
      



この正規表現は、2文字の国コードと特定の汎用トップレベルドメインのみに使用できます。 このリストは現時点では古くなっている可能性があります。 このリストをアプリケーションのグローバル定数として保存することをお勧めします。これにより、リストを1か所で更新するだけで済みます。 すべての国コードをリストすることもできますが、すでに約200の国コードがあります。



電子メールアドレスは、サブドメイン( john@mail.company.comなど)に登録することもできます。 @に続く文字クラスに「 」文字を追加したため、上記のすべての正規表現がこのアドレスを定義します。 しかし、彼らはjohn @ aol ... comも決定しますが 、これは正しくありません。 「 [A-Z0-9 .-] + \。(?:[A-Z0-9-] + \。)+ "」に置き換えることで、このようなケースを排除できます。 キャラクタークラスからポイントを削除し、代わりにそのクラスとポイントキャラクターを繰り返しました。 例えば

 \b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[AZ]{2,4}\b
      
      



john@server.department.company.comを決定しますがjohn @ aol ... comは決定しません。



もう1つのトレードオフは、正規表現ではラテン文字、数字、および一部の特殊文字のみが許可されることです。 これの主な理由は、私のメールサービスが残りの文字を処理できるかどうかがはっきりしないからです。 John.O'Hara@theoharas.comが構文的に正しい電子メールアドレスであっても、一部のメールプログラムはアポストロフィを引用区切り文字と見なす危険があります。 たとえば、文字列が一重引用符で区切られている場合、このアドレスを盲目的にSQLに挿入するとクラッシュします。 そしてもちろん、長年の間、ドメインには非ラテン文字が含まれている場合があります。 ただし、ほとんどのプログラムやドメインレジストラでさえ、使用されている37文字を引き続き使用します。



結論は次のとおりです。どの正規表現を使用するかを決定するために、電子メールアドレスまたは正確に定義された他のものを見つけるかどうかは関係ありません。すべてのトレードオフを検討することから始めなければなりません。 見つかったことが真実ではないという事実はどれほど悪いのですか? 本物が見つからないというのはどれほど悪いことですか? 正規表現はどれほど複雑になりますか? その後、この表現を変更するためにどのような代価を払いますか? これらの質問に対する異なる回答には、ソリューションとして異なる正規表現が必要です。 私の正規表現は私が望むことをしますが、あなたが望むことをしないかもしれません。



正規表現は電子メールを送信しません



正規表現で無効な電子メールアドレスを削除する試みを無理にしないでください。 .museumを有効にする必要がある場合、現在のドメインをすべてリストするよりも、6文字のトップレベルドメインをすべて許可する方が良い場合がよくあります。 その理由は、このメールアドレスが有効かどうかは、メールを送信するまでわからないからです。 そして、これでさえ十分ではないかもしれません。 手紙がメールボックスに届いたとしても、だれかがそれを読むという意味ではありません。



同じ原則が多くの状況に当てはまります。 有効な日付を見つけようとするとき、often年を決定するために正規表現内でこれを行うよりも、少し算術を追加する方が簡単な場合がよくあります。 正規表現を使用して潜在的な一致を見つけるか、入力が必要な構文と一致するかどうかを確認し、正規表現で見つかった候補に対して有効なテストを実行します。 正規表現は強力なツールですが、万能薬ではありません。



公式標準:RFC 2822



おそらく、電子メールアドレスを見つけるための「公式の」信頼できる正規表現がない理由を疑問に思っているでしょうか。 さて、ここに公式の定義がありますが、それはほとんど信頼できません。



公式の標準はRFC 2822として知られています。有効な電子メールアドレスが従わなければならない構文を説明しています。 次の正規表現を使用して実装できます(ただし、実装すべきではありません)。

 (?:[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])+)\])
      
      





この正規表現は、@の前の部分と@記号の後の部分の2つの部分で構成されています。 @の前の部分には2つのオプションがあります。一連の文字、数字、および1つ以上のドットを含む一部の文字で構成できます。 ただし、電子メールアドレスの先頭または末尾にドットを連続して表示することはできません。 別の方法では、@の前の部分を二重引用符で囲む必要があり、ASCII文字の文字列を引用符で囲むことができます。 空白、二重引用符、およびバックスラッシュはバックスラッシュで始まる必要があります。



@の後の部分にも2つの選択肢があります。 これは、完全修飾ドメイン名(example.comなど)または角括弧内のリテラルインターネットアドレスのいずれかです。 リテラルインターネットアドレスは、IPアドレスまたはサブジェクト指向のルーティングアドレスです。



この正規表現を使用しない理由は、電子メールアドレスの基本構文のみをチェックするためです。 john@aol.com.nospamは、RFC 2822に従って有効な電子メールアドレスと見なされます。明らかに、この電子メールアドレスは、.nospamトップレベルドメインがないため機能しません。 また、メールプログラムがこれを処理できることを保証するものでもありません。 すべてのアプリケーションが二重引用符または角括弧を使用した構文をサポートしているわけではありません。 実際、RFC 2822自体は、角括弧の使用を非推奨としてマークしています。



二重引用符と角かっこが使用されている部分を省略すると、RFC 2822のより実用的な実装が得られます。 それでも、実際に使用されているすべての電子メールアドレスの99.99%と一致します。

 [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
      
      





さらに変更できるのは、トップレベルドメインに2文字の国コードを許可し、特定の汎用トップレベルドメインのみを許可することです。 この正規表現は、 asdf@adsf.adsfなどのダミーのメールアドレスをフィルタリングします。 新しいトップレベルドメインを追加したら、更新する必要があります。

 [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[AZ]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b
      
      





したがって、公式の基準に従った後でも、妥協点は残ったままです。 オンラインライブラリまたはフォーラムから正規表現を盲目的にコピーしないでください。 常に独自のデータと独自のアプリケーションでテストしてください。



All Articles