🕌
【Java】quoted-stringに対応したメールアドレスの区切りの対応
概要
メールアドレスを複数入力する時、カンマ等の区切りで入力という仕様は度々あると思います。メールアドレスにはカンマなどは使えない記号文字となっているので、大体のケースには問題はないのですが、ただquoted-string
という例外的な仕様もあったりはします。ということで今回はこのquoted-stringについて書いてみます。
quoted-stringとは
メールアドレスの仕様についてメールアドレスの確認(少し本題:あちこちググってのメアド正規表現の是非)の記事にまとめられているのですが、local partは、 クオーテーションマーク「 " 」のなかにスペースを含むいろんな文字が入った quoted string を含むことがある (RFC2822 3.2.5)
という仕様があります。これは@の前の部分をダブルクオートで囲んだ場合、普通では使用できない記号文字が使えるという仕様になります。
もう少し詳細に解説しているのがRFC 5322 & 5321に沿ったメールアドレス(local-part)に使える文字まとめで、quoted-stringではカンマやセミコロンを使うことができます。
メールアドレスの区切りどうするか
全角文字は絶対にメールアドレスに入らないので全角文字を使えば良いのですが、まぁ仕様的にイケてないですよね。できればカンマとか使いたいのですが、quoted-stringの仕様に対応する時にはどうすれば良いか。結局はメールアドレスを分割するロジック側で、何とかするしかないです。
ということで参考までに、ロジック側で何とかしようとなった時のJavaのサンプルソースを作成してみました。
DelimiterMailTest.java
public class DelimiterMailTest {
public static void main(String[] args){
String testData = "\",test1\"@aaa.com,test2@aaa.com,\"te,s,t3\"@aaa.com";
Pattern p = Pattern.compile("(.+?@.+?),|(.+?@.+$)");
Matcher m = p.matcher(testData);
List<String> result = new ArrayList<>();
while (m.find()) {
String extract = m.group(0);
if (extract.endsWith(",")) {
result.add(extract.substring(0, extract.length() - 1));
} else {
result.add(extract);
}
}
result.stream().forEach(r-> System.out.println(r));
}
}
Discussion