■ はじめに
最近、Email の判定テストを行っていて 不正なEmailアドレスと判定したアドレスに対して 本当にこれ不正?ってことがあったので、 久しぶりに RFC を調べてみた。 こういうこと結構また起きそうなので記録しておく。 タイトルが正規表現だが、メインはEmailアドレスの仕様。 正規表現は次いで位でChatGPTに聞いてみた結果をおまけとして載せておく。 (結論から言うと、RFC準拠の正規表現はとんでもないことになるので どこまでサポートするかを決めておいたほうがいい) なお、ちゃんと知りたい場合は、以下のサイトを参照したほうがいい
https://qiita.com/yoshitake_1201/items/40268332cd23f67c504c
目次
【1】RFC(Request for Comments) 【2】Emailアドレスに関するRFC 【3】Emailアドレス構成 1)使用可能な文字 【4】おまけ:Emailに関する正規表現 1)簡易版 2)応用版
【1】RFC(Request for Comments)
* IETF(Internet Engineering Task Force)が発行している インターネット技術の標準的な仕様を記した文書
【2】Emailアドレスに関するRFC
* フォーマットに関しては、RFC 5322から読むのがいいかも。
RFC 5321 - Simple Mail Transfer Protocol
https://tex2e.github.io/rfc-translater/html/rfc5321.html
RFC 5322 - Internet Message Format
https://tex2e.github.io/rfc-translater/html/rfc5322.html
RFC 6854 - Update to Internet Message Format ...
https://tex2e.github.io/rfc-translater/html/rfc6854.html
RFC 7504 - SMTP 521 and 556 Reply Codes
https://tex2e.github.io/rfc-translater/html/rfc7504.html
【3】Emailアドレス構成
ローカル部@ドメイン(例:sample@example.com)
https://datatracker.ietf.org/doc/html/rfc5322#section-3.4.1
addr-spec = local-part "@" domain local-part = dot-atom / quoted-string / obs-local-part domain = dot-atom / domain-literal / obs-domain
1)使用可能な文字
a-zA-Z0-9.!#$%&'*+/=?^_{|}~-
https://datatracker.ietf.org/doc/html/rfc5322#section-3.2.3
atext = ALPHA / DIGIT / ; Printable US-ASCII "!" / "#" / ; characters not including "$" / "%" / ; specials. Used for atoms. "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~" atom = [CFWS] 1*atext [CFWS] dot-atom-text = 1*atext *("." 1*atext) dot-atom = [CFWS] dot-atom-text [CFWS] specials = "(" / ")" / ; Special characters that do "<" / ">" / ; not appear in atext "[" / "]" / ":" / ";" / "@" / "\" / "," / "." / DQUOTE
【4】おまけ:Emailに関する正規表現
* 上記を踏まえて、ChatGPTにEmailに関する正規表現を聞いてみた
* なお、全く試していないので、ネタ位に思って頂けると、、、
1)簡易版
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
説明
^ : 行の始まり [a-zA-Z0-9._%+-]+ : ユーザー名部分。英数字や一部の記号が含まれる。 @ : @マーク [a-zA-Z0-9.-]+ : ドメイン名部分。英数字やドット、ハイフンが含まれる。 \. : ドット(ドメインの区切り) [a-zA-Z]{2,} : ドメインのトップレベル部分(例:com, jpなど)。2文字以上の英字。 $ : 行の終わり # この正規表現は基本的な形式をカバーしていますが、 # 全てのメールアドレスの形式を完全に検証することは難しいため、 # 特定のニーズに応じて調整が必要かもしれません。
2)応用版
「RFCに準拠した形でお願いします」って聞いたら、、、 # ちなみに別で聞いた時にはとんでもない正規表現だしてきたので # 聞き方によったり、まちまちかも
正規表現1
^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$
説明1
^ : 行の始まり [a-zA-Z0-9.!#$%&'*+/=?^_{|}~-]+` : ユーザー名部分。RFC 5322で許可されている文字を含む。 @ : @マーク [a-zA-Z0-9.-]+ : ドメイン名部分。英数字、ドット、ハイフンを含む。 \\. : ドット(エスケープ) [a-zA-Z]{2,} : ドメインのトップレベル部分(例:com, jpなど)。2文字以上の英字。 $ : 行の終わり # この正規表現は、一般的なメールアドレスを検証するのに役立ちますが、 # RFCに完全に準拠したすべてのメールアドレスをカバーするわけではありません。 # 特に、RFCでは非常に特異なケース(例えば、複雑なユーザー名やドメイン)も # 許可されているため、注意が必要です。 # 実際の用途に応じて、もう少し厳密なバリデーションが必要な場合は、 # より詳細な正規表現や追加のロジックを検討してください。
正規表現2
^(?![_.-])[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(?![_.-])@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,})$
説明2
^ : 行の始まり (?![_.-]) : ユーザー名の最初の文字が .、_、または - でないことを確認 [a-zA-Z0-9.!#$%&'*+/=?^_{|}~-]+` : ユーザー名部分。RFC 5322で許可されている文字を含む。 (?![_.-]) : ユーザー名の最後の文字が .、_、または - でないことを確認 @ : @マーク [a-zA-Z0-9-]+ : ドメイン名部分。英数字とハイフンを含む。 (\.[a-zA-Z0-9-]+)* : サブドメインを含む部分。0個以上のサブドメインを許可。 (\.[a-zA-Z]{2,}) : 最後のトップレベルドメイン部分。2文字以上の英字。 $ : 行の終わり
参考文献
https://qiita.com/yoshitake_1201/items/40268332cd23f67c504c
メールアドレス - Wikipedia
関連記事
正規表現~ 入門編 ~
https://dk521123.hatenablog.com/entry/2011/09/10/235712
SQLでマスキングを実装
https://dk521123.hatenablog.com/entry/2022/10/02/000000