home wiki.fukuchiharuki.me
Menu

いろいろな独自仕様があるようなので、簡単な正規表現でバシッと定義することは難しい。ので、もうチェックしなきゃいいんじゃないのという気もするけど、入力ミスってますよ、くらいのフィードバックはしたいからゆるいチェックはしたい。

仕様

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

ローカル部

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

次は省く(type=emailしたときのブラウザのチェックにもないか)

  • . が先頭または末尾あるいはそのどちらもにあってはいけない
  • . が連続してはいけない

次は諦める

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

ドメイン部

  • ラテン文字
  • 数字
  • -

次は省く

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

次は諦める

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

実装

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);