メールアドレスは正規表現でよくチェックするもののひとつだろう。
JavaやPHPなどを含めたプログラミングごとの正規表現の書き方と、実際のサンプルプログラムを用意してみた。参考にしていただければと思う。
目次
正規表現によるメールアドレスの扱い方
正規表現を使うと、メールアドレスのチェックをしたり、テキストの中からメールアドレスを抽出したりすることができる。
メールアドレス
最初に、対象となるメールアドレスはどのような仕様に基づいているかを確認しておこう。
メールアドレスに関して最新の仕様と言えそうなものが、RFC 5322 (Internet Message Format)の「3.4.1. Addr-Spec Specification」に定義されている。厳密にこの仕様を正規表現で実現したいのであれば、最新の仕様をじっくり読んで理解したうえで独自に正規表現を定義してください。また、@の前に「.」を許すような仕様は今回含んでいません。
ここでは、RFC 5322仕様の中の「dot-atom」に記載された仕様に従ってメールアドレスの形式を説明している。
RFC 5322に規定されているメールアドレスの形式は次の通りです。「@」を挟んでlocal-partとdomainの二つの部分に分かれている。
基本形式 local-part @ domain
使える文字
「domain」も、「local-part」で使用可能な文字とは、以下の文字である。
半角英数字
or
「!#$%&'*+-/=?^_`{|}~」
「local-part」は、一文字以上の使用可能文字である。さらに、「.」に続けて一文字以上の使用可能文字をセットとして複数追加することができる。しかし、「.」だけを最後の文字として追加することはできない。
「domain」も、「local-part」と同じ規則が適用される。
正規表現
では、このメールアドレスの仕様に基づいた正規表現はどうなるか見てみよう。メールアドレスの正規表現は以下のようになる。とりあえずJavaのバージョンだ。
^[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*@[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*$
この正規表現は、複雑なのでどのような構造になっているかを説明しておく。
aTextが使用可能な文字の正規表現である。そのaTextによってドッドを含む文字列の正規表現dotAtomを作る。dotAtomの先頭は一文字以上のaTextである。最終的にメールアドレスの正規表現はdotAtomによって定義される構造になっている。
・ aText = [a-zA-Z0-9!#%&'/=_~`\*\+\?\{\}\^\$\-\|]
・ dotAtom = aText + "+" + "(\\." + aText + "+)*"
・ メールアドレスの正規表現 = dotAtom + "@" + dotAtom
よくわからなければ、はじめはコピーアンドペーストで使っていただいて構わない。また、もっと簡単な制限をかけたり、もっとしっかりと制限をかけたりということもできる。
メールアドレスで使える文字も少しずつ変わっていっているので、ある程度適切な緩めの表現を使うのがいいだろう。
各プログラミング言語における正規表現表記
この比較表は、Java以外のプログラミング言語で東京の固定メールアドレスの正規表現を扱うとどうなるかを示している。
|
言語 |
正規表現 |
|
Java |
^[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*@[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*$
|
|
Ruby |
^[\w!#%&'\/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'\/=~`\*\+\?\{\}^\$\-\|]+)*@[\w!#%&'\/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'\/=~`\*\+\?\{\}\^\$\-\|]+)*$
(Javaとほぼ同じだが、「/」を「\/」とする必要がある。) |
|
PHP |
/^[\w!#%&'\/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'\/=~`\*\+\?\{\}\^\$\-\|]+)*@[\w!#%&'\/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'\/=~`\*\+\?\{\}\^\$\-\|]+)*$/
(Javaと同じだが、「/」で挟まれている。また、「/」を「\/」とする必要がある。) |
|
C/C++ |
^[[:w:]!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[[:w:]!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*@[[:w:]!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[[:w:]!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*$
(Javaとほぼ同じだが、「\w」を「[:w:]」に置き換える必要がある。) |
メールアドレスをチェックするサンプルプログラム
それでは、実際にサンプルプログラムを確認してみよう。
このJavaのサンプルプログラムでは、メールアドレスが形式に合致しているかどうか正規表現を使ってチェックしている。メールアドレス「abc.def@efg.com」については、アドレスが正しい場合だけでなく、誤った場合に不正なアドレスとして検出されることも確認している。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CheckMailAddress {
public static void main(String args[]) {
checkRightMailAddresses();//[1]
checkWrongMailAddresses();//[2]
}
private static void checkRightMailAddresses() {//[3]
System.out.println("[4] 正しいメールアドレス");
checkMailAddressByRegularExpression("abc.def@efg.com");//[5]
checkMailAddressByRegularExpression("abcABC123.defDEF456@ghiGHI789.comCOM012");//[6]
checkMailAddressByRegularExpression("#%&'/=~`*+?{}^$-|.def@ghi.com");//[7]
checkMailAddressByRegularExpression("abc.#%&'/=~`*+?{}^$-|@ghi.com");//[8]
checkMailAddressByRegularExpression("abc.def@#%&'/=~`*+?{}^$-|.com");//[9]
checkMailAddressByRegularExpression("abc.def@ghi.#%&'/=~`*+?{}^$-|");//[10]
}
private static void checkWrongMailAddresses() {//[11]
System.out.println("[12] 誤ったメールアドレス");
checkMailAddressByRegularExpression("abc.@ghi.com");//[13]
checkMailAddressByRegularExpression("abc.def@.com");//[14]
checkMailAddressByRegularExpression("ab<c.def@ghi.com");//[15]
checkMailAddressByRegularExpression("abc.de<f@ghi.com");//[16]
checkMailAddressByRegularExpression("abc.def@gh<i.com");//[17]
checkMailAddressByRegularExpression("abc.def@ghi.co<m");//[18]
}
private static void checkMailAddressByRegularExpression(String address) {//[20]
boolean result;//[21]
String aText = "[\\w!#%&'/=~`\\*\\+\\?\\{\\}\\^\\$\\-\\|]";//[22]
String dotAtom = aText + "+" + "(\\." + aText + "+)*";//[23]
String regularExpression = "^" + dotAtom + "@" + dotAtom + "$";//[24]
result = checkMailAddress(address, regularExpression);//[25]
if (result) return;;//[26]
System.out.println("[27] 不正なメールアドレス:" + address);
}
private static boolean checkMailAddress(String address, String regularExpression) {//[40]
Pattern pattern = Pattern.compile(regularExpression);//[41]
Matcher matcher = pattern.matcher(address);//[42]
if (matcher.find()) {//[43]
System.out.println("[44] " + "メールアドレス:" + matcher.group());
return true;//[45]
}
return false;//[46]
}
}
実行結果
[4] 正しいメールアドレス
[34] メールアドレス:abc@def.com
[34] メールアドレス:a.bcABC123@defDEF456.comCOM789
[34] メールアドレス:#.#%&'/=~`*+?{}^$-|@def.com
[34] メールアドレス:abc@#.#%&'/=~`*+?{}^$-|
[10] 誤ったメールアドレス
[27] 不正なメールアドレス:abc.@def.com
[27] 不正なメールアドレス:abc@.def.com
[27] 不正なメールアドレス:ab<c@def.com
[27] 不正なメールアドレス:abc@de<f.com
[27] 不正なメールアドレス:abc@def.c<m
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] メソッドcheckRightMailAddresses(正しいメールアドレスのチェック)を呼び出す。
- [2] メソッドcheckWrongMailAddresses(誤ったメールアドレスのチェック)を呼び出す。
- [3] メソッドcheckRightMailAddressesを定義する。
- [4] 「正しいメールアドレス」を表示する。
- [5]-[7] 以下のメールアドレスをメソッドcheckMailAddressByRegularExpressionの引数として渡し、チェックする
- [9] メソッドcheckMailAddressesを定義する。
- [10] 「誤ったメールアドレス」を表示する。
- [20] メソッドcheckMailAddressByRegularExpressionを定義する。
- [21] 変数resultを定義する。
- [22] aTextに使用可能な文字の正規表現を代入する。
- [23] aTextによってドッドを含む文字列の正規表現を作り、dotAtomに代入する。
- [24] dotAtomによってメールアドレスの正規表現を作り、メールアドレスの正規表現に代入する。
- [22]-[26] メソッドcheckMailAddressを呼び出し、メールアドレスaddressを正規表現でチェックする。
- [27] 「不正なメールアドレス:」に引数の「メールアドレス」を加えて表示する。
- [40] メソッドcheckMailAddressを定義する。
- [41] 指定された正規表現を持つPatternのインスタンスpatternを生成する。
- [42] メールアドレスaddressを引数に指定してpatternからmatcherを取得する。
- [43][44][45] メールアドレスが正規表現に一致していれば、メールアドレスを表示し、trueを戻す。
- [46] falseを戻す。
まとめ
このページではメールアドレスの正規表現についてまとめてみた。
よく使うものだが、覚える必要はない。使いたくなったら、閲覧に来ていただければと思う。



