Zenn
📩

君はメールアドレスの正規表現を適当にググって使っていないか?

2025/02/25に公開
11件
149

もう、そういうのは卒業しよう。

今日からメールアドレスのバリデーションの正規表現は

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

だ。いいね?

なぜこの正規表現がいいのか

ちなみにこれの何がいいかというと

「HTMLの標準仕様を定めるWHATWGの正規表現をそのまま使っている」ところ。
https://html.spec.whatwg.org/multipage/input.html#email-state-(type=email)

つまり、各ブラウザのデフォルトの<input type="email" />のバリデーションと一致するという大きなメリットを得られる。

これはMDNにも載っている列記とした「実用的な」正規表現だ。

ちなみにRFCオタクがRFC準拠のおおよそ実用に耐えないであろうメールアドレスの正規表現を推してくるかもしれないが無視して良い。
例えば、RFCに準拠している以下のようなメールアドレスを君のシステムで許容したいと思うだろうか?

"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com

ちなみにRubyだとURI::MailTo::EMAIL_REGEXPで、WHATWGの正規表現とほぼ同じ正規表現にアクセスできる。

> ruby -r uri -e 'puts URI::MailTo::EMAIL_REGEXP'
(?-mix:\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z)

言語側のライブラリーで用意されている正規表現を使うのが最も安全で楽だね。

まとめ

メールアドレスのバリデーションには、WHATWGの標準の正規表現を使うことをお勧めする。

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

これを使うメリットは:

  1. ブラウザの <input type="email" /> のバリデーションと一致する
  2. 実用的な範囲でメールアドレスを検証できる
  3. 信頼できるHTMLの標準に基づいている

適当にググって見つけた情報を使うだけでは、いつまで経っても初心者から抜け出せない。
標準に基づいた実装を選ぶことで、より確信を持ってシステムを作ることができる。

とにかく、メールアドレスのバリデーションという枯れた分野で適当にググった正規表現を使うのは卒業しよう。

149

Discussion

ログインするとコメントできます