メールアドレスの正規表現

正規表現のサンプルの中でメールアドレスにマッチする正規表現について解説します。

(Last modified: )

メールアドレスにマッチする正規表現

メールアドレスは次のような値となります。

username@example.com

メールアドレスにマッチする正規表現は次のようになります。

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

ドット( . )に関する制限を考慮した場合の正規表現は次の通りです(こちらはあとで解説します。)

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

以下解説と前提条件です。

ローカル部分( @ よりも前の部分)には仕様上はかなり多くの文字を使用できる(例えば !# など)のですが、実際はサービス側で文字の制限を行っているケースが多いです。例えば Gmail のメールアドレスでは使用できる文字はアルファベット(a-z)、数字(0-9)、ピリオド(.)、プラス(+)だけです。 Outlook.com の場合はこれに加えてアンダーバー(_)やハイフン(-)も利用可能です。

※ ドットは最初や最後では使用できず、またドットを連続して使用できません。このチェックを行うものはこのあとで解説します。

これらの一般的に使われる文字の組み合わせで考えるとローカル部分の正規表現は次のようになります。追加で使用する文字がある場合は [ から ] の中に追加してください。

[a-zA-Z0-9_.+-]+

※ 角括弧[]の中でハイフン( - )を文字としての意味で記述する場合、最初か最後以外の場所に記述する場合は \ によるエスケープが必要です。

@ 以降のドメイン名の正規表現は「ドメイン名の正規表現」で解説したものを使います。

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

ローカル部分とドメイン名を @ で結び、これに文字列の先頭にマッチするキャレット( ^ )と文字列の末尾にマッチするドル記号を( $ )を追加して組み合わせたものがメールアドレスを表す正規表現となります。

サンプル

JavaScript を使って簡単な正規表現のサンプルを作成してみます。

const regex = /^[a-zA-Z0-9_.+-]+@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$/;

regex.test('hoge@example.com');
--> true
regex.test('yamada.tarou@example.com');
--> true
regex.test('suzuki.example.com');
--> false // ローカル部分がない
regex.test('kudou#jirou@examle.com');
--> false // ローカル部分で使用できない文字種

メールアドレスにマッチする正規表現(1)

ローカル部分で連続するドットや先頭と末尾のドットを禁止する

メールアドレスのローカル部分ではドット( . )は使用できますが、連続して使用したり先頭や末尾で使用することは禁止されています。

✕  user..name@example.com
✕  .username@example.com
✕  username.@example.com

ドットに関する制限を加えたメールアドレスの正規表現は次の通りです。

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

以下解説と前提条件です。

ローカル部分は次のいずれかの形式となります。(ドットはいくつ含まれていてもいいですが、連続しては利用できません)。

aaaaaaaaaaa@
aaa.aaaaaaa@
aa.aa.aaaaa@
aa.aa.aa.aa@

これを文字で表すと次のようになります。

(1) ドット以外の文字が 1 個以上
(2) ドット+(ドット以外の文字が 1 個以上)
(3) (2)が 0 個以上
(4) @

(1) ドット以外の文字が 1 個以上、は次のように表すことができます。

[a-zA-Z0-9_+-]+

(2) ドット+(ドット以外の文字が 1 個以上)、は次のように表すことができます。

\.[a-zA-Z0-9_+-]+

(3) (2)が 0 個以上、は次のように表すことができます。

(\.[a-zA-Z0-9_+-]+)*

これを組み合わせたものがドットに関する制限を加えたローカル部分の正規表現となります。

[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*@

サンプル

JavaScript を使って簡単な正規表現のサンプルを作成してみます。

const regex = /^[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$/;

regex.test('hoge@example.com');
--> true
regex.test('yamada.tarou@example.com');
--> true
regex.test('suzuki..jirou@example.com');
--> false // ドットが連続している
regex.test('kudouhanako.@examle.com');
--> false // ローカル部分の末尾にドット

ローカル部分で連続するドットや先頭と末尾のドットを禁止する(1)

-- --

正規表現のサンプルの中でメールアドレスにマッチする正規表現について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。