この記事では、正規表現を使用した電子メール検証について説明します。 すべての正規表現は
i
修飾子で実行されます。 大文字と小文字を区別しない検証を行います。
準備する
検証を記述する前に、電子メールアドレスの構成を知る必要があります。 私は誰もがこれが「ユーザー名@ホスト名」であることを知っていると思います。 正規表現の作成を、ホスト名検証とユーザー名検証という2つの論理的な部分に分けるのが最善です。 もっとボリュームのあるものから始めましょう。
ホスト名検証
まず、ホスト名の構成について考えてみましょう。
ホスト名は、ピリオドで区切られた63文字以下の複数のコンポーネントとサフィックス(第1レベルドメイン)で構成されます。 同様に、コンポーネントはラテン文字、数字、ハイフンで構成され、ハイフンはコンポーネントの先頭または末尾に配置できません。 サフィックスは、第1レベルドメインの限定リストです(
IANA Webサイトでリストを見つけました)。 式を簡略化するために、国のドメインを
[az][az]
として記述します(aからzまでの2文字は大文字と小文字を区別しません)。 また、非ラテン文字が公式に使用されるまでは使用しません。 結果として、接尾辞をチェックする式を取得します(構造
(foo|bar)
は、fooまたはbarのいずれかが検索されていることを示します。つまり、orを置換します)。
(aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|[az][az])
コンポーネントの場合、コードはより複雑になります。
([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)
式を分析しましょう:
[a-z0-9] #
([-a-z0-9]{0,61}[a-z0-9])? #
\. #
オプション部分を検討してください。
# ,
# {0,61} , 0 61
[-a-z0-9]{0,61}
# 61 , 63
[a-z0-9]
その結果、ホスト名を確認する式を取得しました。
([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)*(aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|[az][az])
コンポーネントの存在は必要ないという事実に注目します。なぜなら、 一部の第1レベルドメインはサーバーでサポートされています。
例 。
ユーザー名の検証
ユーザー名には以下を含めることができます。
- ラテンアルファベット
- フィギュア
- サイン! #$%& '* +-/ =? ^ _ `{| }〜
- ポイント。最初と最後の文字を除き、繰り返すことはできません
次の式をお見せしましょう。
[-a-z0-9!#$%&'*+/=?^_`{|}~]+(\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*
実際、ここではすべてがシンプルです:1つ以上のシンボル
[-a-z0-9!#$%&'*+/=?^_`{|}~]
、その後0個以上のコンポーネント
\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+
。
最後に
正規表現のメール確認:
^[-a-z0-9!#$%&'*+/=?^_`{|}~]+(\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*@([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)*(aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|[az][az])$
この式は少し最適化できます(最適化については、別の記事があると思います)。
^[-a-z0-9!#$%&'*+/=?^_`{|}~]+(?:\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*@(?:[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)*(?:aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|[az][az])$
ボーナス
最初のトピックの
解説で例として引用された正規表現を考えてみましょう。
^(\S+)@([a-z0-9-]+)(\.)([az]{2,4})(\.?)([az]{0,4})+$
主な問題は何ですか?
- ユーザー名はスペースを除く任意の文字で構成できるため、ユーザー名「日本国」は有効です。
- 第1レベルのドメインは、任意の4つのラテン文字で構成できます。たとえば、.habr
- ひどいドメインチェック:1文字以上、必須ポイント、2〜4文字の必須文字、オプションポイント、0〜4文字の増分。 さらに、これらの各ブロックはメモリに保存されます。
PSバグや要望について書いてください-私は間違いなくそれを修正します。
PPS自由に使用できる電子メール検証機能をレイアウトできます。