末の娘ほのちゃんの宿題が福笑だったので一緒にやってみた。

 小学1年生は宿題も楽しい。さあ,今年も笑っていきましょう!

 新春からはじめた正規表現の解説も今回で3回目です。今回はメールアドレスのチェックについて考えてみましょう。メールアドレスが本当に有効かどうかはメールを送ってみないとわかりません。メールを送ってみて,User unknownなどと記したエラーを知らせるメールが返ってこなければ,メールアドレスが存在すると本当に判断できます。

 Webアプリケーションのユーザー登録では,入力されたメールアドレスに本登録を促すメールを送り,本人確認を行うことが多いですね。しかし「送ってみんなんわからんちゃ」(富山弁解説 送ってみないとわからないよ)と,入力されたメールアドレスをノーチェックでデータベースに登録するのは省エネが過ぎます。国土交通省のチェックがなくても,許されない手抜きです。メールアドレスとして正しい,いや正しそうな形式を持っているかはチェックすべきです。

 では,よく目にするメールアドレスはどんな文字列でしょうか?abc@xyz.comやabc@xyz.ne.jpなどの代表的なアドレス,それから組織が大きいとabc@xyz.stu.ne.jpやabc@xyz.stu.vw.ne.jpなどと,@以降のドメイン名が細分化されていることも多いですね。

 明らかに許してはいけないのはabc.xyz.netのように@がないメールアドレスや@が二つ以上あるアドレス(abc@xyz@stu.ne.jp)です。abc@xyz..ne.jpのようにドメイン名にドットが連続するアドレスもエラーとしてはじきたいところです。

 上記の内容を正規表現として記述した例が以下です。

----------------------------------------------------------

[\\w\\.\\-]+@(?:[\\w\\-]+\\.)+[\\w\\-]+

----------------------------------------------------------
 \wはaからz,AからZ,0から9の数字,そしてアンダースコア(_)に一致するメタ文字です。ドット(.)は任意の一文字に一致するメタ文字ですが,ここでは\でエスケープしてドットそのものと一致するようにしています。ハイフン(-)もメールアドレスに使う文字です。[・・・]は[ ]の中のいずれかの文字にマッチを意味するので,@の前のユーザー名を構成する文字としてaからz,AからZ,0から9の数字,アンダースコア(_),ドット(.),ハイフン(-)が使えることになります。

 次に出てくるメタ文字「+」が今回の正規表現のミソです。+の前の文字が1個以上繰り返すことを意味します。前回説明したアスタリスク(*)は0個以上の繰り返しだったので省略が可能でしたが,メールアドレスのユーザー名を省略されては困るので,+を使います。最低でも1文字のユーザー名は必要なことになるのです。

 その後,アットマーク(@)がひとつ続き,(?:・・・・)で[\\w\\-]+\\.がグループ化されます。グループに+が続くので「xyz.」のようなグループが1個以上続くことを表現できます。abc@xyz.stu.ne.jpやabc@xyz.stu.vw.ne.jpにも対応できるのです。
----------------------------------------------------------

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegTest3 {
 public static void main(String[] args) {
  String ptnStr ="[\\w\\.\\-]+@(?:[\\w\\-]+\\.)+[\\w\\-]+";
  Pattern ptn = Pattern.compile(ptnStr);
  String text ="abc@xyz.net";
  Matcher mc = ptn.matcher(text);
  if(mc.matches()) {
   System.out.println(text+"はマッチする");
  } else{
   System.out.println(text+"はマッチしない");
  }
 }
}

----------------------------------------------------------
 上記のようなコードを作成してString型変数textに与えるメールアドレスをいろいろ変更して試してみてください。このチェック・パターンではマッチしない変わったメールアドレスもあるでしょう。そのときは自分で正規表現を広げてみてください。