home wiki.fukuchiharuki.me
Menu

#author("2017-03-22T02:18:41+00:00","default:haruki","haruki")
#author("2017-06-19T05:41:18+00:00","default:haruki","haruki")
いろいろな独自仕様があるようなので、簡単な正規表現でバシッとメールアドレスを定義することは難しい。ので、もうチェックしなきゃいいんじゃないのという気もする。けど、入力ミスってますよ、くらいのフィードバックはしたいからゆるいチェックはやっぱりする。

* 仕様 [#m0ace2a7]

およそWikipediaに記載のルールに従って次をとりあげた。

** ローカル部 [#q4c61181]

- 大小のラテン文字
- 数字
- ! # $ % & ' * + - / = ? ^ _ ` { | } ~
- .
- 最大長64文字

次は省く(type=emailしたときのブラウザのチェックにもないか)
- . が先頭または末尾あるいはそのどちらもにあってはいけない
- . が連続してはいけない

次は諦める

- "" でくくられた形式であれば他に記号が使える

** ドメイン部 [#c6ff33fe]

- ラテン文字
- 数字
- -
-- TLDにはなし

次は省く

- ドメインの長さの最大長253文字
- メールアドレス全体の長さの最大長254文字

次は諦める

- [] でくくられたIPアドレス

* 実装 [#u275b992]

Optionalの箇所は入力がない場合はパスするように。

 String local = "[a-zA-Z0-9!#$%&'*+\\-./=?^_`{|}~]{1,64}";
 String domain = "([A-Za-z0-9\\-]+\\.)+[A-Za-z]+";
 String address = local + "@" + domain;
 String regex = "^" + address + "$";
 
 Optional.ofNullable(input)
 .filter(i -> i != null)
 .filter(i -> ! i.isEmpty())
 .map(i -> i.matches(regex))
 .orElse(true);