📩
今時のメールアドレス正規表現
結論
広く許容する場合は以下の正規表現。
[^\s]+@[^\s]+
解説:アットマークの直前がホワイトスペース以外かつ、アットマークの直後がホワイトスペース以外。
参照:https://github.com/balexand/email_validator/blob/a479ff6bf9305ba7944df459402664fc9d74a339/lib/email_validator.rb#L13
背景
- きっかけ
- Webアプリケーションのメールアドレスのvalidationには
email_validator
というgemを使っていました。これがv2からすごい緩いバリデーションになっていました。
- Webアプリケーションのメールアドレスのvalidationには
- 理由
- テストケース
妥協
-
AWS SESは
test_test@example.com
というマルチバイトを含んだメールアドレスはrejectされる。 -
ASCII以外の文字列って、ユーザの入力ミスの可能性が90%以上だろうし。悩ましい。
-
HTML5のブラウザ側の正規表現は、もっと厳しい。マルチバイトは許されない。
-
実際は、v1.6の
strict_mode
オプションを使うのが良いのかなと。 -
v1.6のstrictな正規表現で怪しいメアドをあぶり出すショートコード
name_validation = "-\\p{L}\\d+._"
regex = /\A\s*([#{name_validation}]{1,64})@((?:[-\p{L}\d]+\.)+\p{L}{2,})\s*\z/i
User.all.select {|u| puts u.id unless u.email.match(regex) }
-
URI::MailTo::EMAIL_REGEXP
もよさそう。
/\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/
Discussion