Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 7950

【プログラム】正規表現 ~ Email ~ - プログラム の超個人的なメモ

$
0
0

■ はじめに

 最近、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に関する正規表現を聞いてみた

https://chatgpt.com/

* なお、全く試していないので、ネタ位に思って頂けると、、、

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に準拠した形でお願いします」って聞いたら、、、

# ちなみに別で聞いた時にはとんでもない正規表現だしてきたので
# 聞き方によったり、まちまちかも

正規表現

^[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では非常に特異なケース(例えば、複雑なユーザー名やドメイン)も
# 許可されているため、注意が必要です。

# 実際の用途に応じて、もう少し厳密なバリデーションが必要な場合は、
# より詳細な正規表現や追加のロジックを検討してください。

正規表現

^(?![_.-])[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


Viewing all articles
Browse latest Browse all 7950

Trending Articles