末の娘ほのちゃんの宿題が福笑だったので一緒にやってみた。
小学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に与えるメールアドレスをいろいろ変更して試してみてください。このチェック・パターンではマッチしない変わったメールアドレスもあるでしょう。そのときは自分で正規表現を広げてみてください。