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

ちゃんとやるとPerlメモ - メールアドレスに一致する正規表現のとおりだが実用的ではない。一番いいのはそこにもあるようにEmail::ValidまたはMail::CheckUserを使うことだと思う(perl限定だが)。RFC822::isValidInetAddressだとdocomoの例のアドレスが弾かれるのでちょっとまずい。

一番現実的な正規表現http://www.tt.rim.or.jp/~canada/comp/cgi/tech/mailaddrmatch/にあるもの(これは以前Perlメモ - メールアドレスに一致する正規表現にあったもののはず)。

少し手を加えてみた。

$ascii  = '[a-zA-Z0-9!#$%&\'*+\-\/=?^_`{|}~.]';
$domain = '(?:[-a-z0-9]+\.)+[a-z]{2,}';//
#$d3     = '\d{1,3}';
#$ip     = $d3.'\.'.$d3.'\.'.$d3.'\.'.$d3;
#$validEmail = "^$ascii+\@(?:$domain|\\[$ip\\])$";
$validEmail = "^$ascii+\@$domain$";

$re = "/$validEmail/i"

もちろんこれは既存のメールアドレスの簡易チェックに使えるだけであって、メールアドレスを新規作成する場合にはこの正規表現を使ってはいけない。

あと、システムによってはsomeone@localhostなども弾くべき状況があると思う。localhostだけなら上記正規表現で弾かれるが、localhost.localdomainは弾かれない。IP指定を許可するなら*1127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16も弾くべきか。
参考:7-3. メールアドレスの正規表現 - ばけらのPerlメモ@鳩丸よもやま話

割り切って、/^[^@]+@[^.]+\..+/としてしまってもいいかも。
参考:メールアドレスを正規表現で判定する方法 - Webプログラマー+WebデザイナーなZARU日記

まねをしてはいけない。
訂正:実用的なPHP用の正規表現x8:phpspot開発日誌

*1:許可するべき状況はないと思う