メールアドレスの正規表現を考えてみた

メールアドレスの正規表現をネットで検索してみると、、、

f:id:haru89:20200509140025p:plain:w70短くシンプルなものから

[^\s]+@[^\s]+

f:id:haru89:20200509140055p:plain:w70このような長いものまであった。

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

自分でもメールアドレスのルールを以下のように仮定し、正規表現を考えてみた。

メールアドレスのルール

  1. 使える文字はアルファベット大文字小文字 (a~z, A~Z) 、数字 (0~9)、ピリオド「.」、アンダースコア「_」、ハイフン「-」、アットマーク「@」

  2. @の前後に1文字以上の文字列が存在する

  3. 文字列の最初の文字は、アルファベットか数字であること

  4. @は1個

  5. @の後の最初の文字は、ピリオド(.)以外

  6. @から2文字以降から末尾の間にピリオド(.)が1つ以上存在する

これらの条件を満たすよう考えた正規表現がこちら

/^[a-zA-Z\d]+[\w\.-]*@[\w-]+\.[\w\-]+[\w\.-]*$/

それぞれ分解して意味を確認していく

① / /で囲んだ間に正規表現のパターンを記載する

② ^ 先頭を表す

③ [a-zA-Z\d] アルファベットと数字のいずれかを表す

④ + 直前の文字が1個以上であることを表す

⑤ ^[a-zA-Z\d]+ 先頭には文字列(アルファベットと数字のいずれか)が1個以上存在することを表す

⑥ \w アルファベットと数字とアンダーバー「_」を表す

⑦ * 直前の文字が0個以上存在することを表す

⑧ [\w.-]* 文字列(アルファベットと数字とアンダーバー「.」とピリオド「.」とハイフン「-」のいずれか)が0個以上存在することを表す

⑨ @[\w-]+ アットマーク「@」の後ろに文字列(アルファベットと数字とアンダーバー「_」とハイフン「-」いずれか)が1個以上存在することを表す

⑩ .[\w-]+ ピリオド「.」の後ろに文字列(アルファベットか数字かアンダーバー「_」かハイフン「-」)が1個以上存在することを表す

⑪ $ 末尾を表す

⑫ [\w.-]*$ 末尾に文字列(アルファベットか数字かアンダーバー「_」かピリオド「.」かハイフン「-」)が0個以上存在することを表す

冒頭の2つの正規表現と比べてみる

①シンプルなもの

[^\s]+@[^\s]+

②少し長め

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

③今回自分が作ってみたもの

/^[a-zA-Z\d]+[\w\.-]*@[\w-]+\.[\w\-]+[\w\.-]*$/

3つの正規表現で共通している点は

  • 文字列の間にアットマーク「@」が1個存在すること
  • アットマーク「@」の前後に文字列が1個以上存在すること

反対に主な相違点は、先頭の文字列

①では

[^\s]
スペース以外の文字であれば良いというシンプルな表現

②では

\^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]
①の正規表現ほどではないが、英数字以外にもたくさんの記号が使える

③では

\^[a-zA-Z\d]+[\w\.-]*
先頭の文字には英数字しか使えない制限が存在する

また、②の[a-zA-Z0-9]と③[a-zA-Z\d]は少し形は違うが、意味としては全く同じ(アルファベットと数字を表す)となる

まとめf:id:haru89:20200509141621p:plain:w70

メールアドレスの正規表現は上記以外にもたくさんネット上に転がっていた。理由としては、メールアドレスの形式が共通化されていないことや、正規表現には、同じ意味でも異なった表現方法が多々存在することなどが考えられる。表現したいことに合わせてルールを厳しくしたり、逆に簡易的なものにしたり、柔軟に対応できるようにしたい。

参考

https://qiita.com/matsubo/items/3dfb1ddb6e155c44643b https://qiita.com/sakuro/items/1eaa307609ceaaf51123 https://qiita.com/jnchito/items/893c887fbf19e17d3ff9