【Java】quoted-stringに対応したメールアドレスの区切りの対応

公開:2020/11/08
更新:2020/11/08
1 min読了の目安(約1600字TECH技術記事

概要

メールアドレスを複数入力する時、カンマ等の区切りで入力という仕様は度々あると思います。メールアドレスにはカンマなどは使えない記号文字となっているので、大体のケースには問題はないのですが、ただ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));
    }
}