連載
» 2003年09月09日 00時00分 公開

基礎から学ぶサーブレット/JSP(8):クラスライブラリを攻略「ユーティリティ編」 (3/5)

[山田祥寛,@IT]

正規表現でメールアドレスを取得する―Pattern/Matcherクラス(1)―

 電子メールのアドレスやURLパターン、郵便番号、電話番号など、比較的複雑な文字列パターンを検索・照合したいという場合に、正規表現は強力な手段を提供します。

 例えば「999-9999」からなる郵便番号をチェックしたいといった場合にも、従来の方法では「全部で8けたであること」「1〜3、5〜8けた目が数値であること」「4けた目がハイフンであること」をチェックしなければならず、また、それが関係ない文字列中に混在している場合には、さらに複雑なロジックを組まなければなりませんでした。

 しかし、正規表現を用いることでこうしたロジックをまったく必要としなくなります。正規表現パターンは一見複雑で無意味な記号の羅列にも見えますが、シンプルかつ簡潔にこうした規則性を記述することができるのです。

 ここでは、与えられたフリーフォーマットの文字列中から電子メールのアドレスのみを検索、抽出する方法を紹介することにしましょう。

リスト5 mailSelect.jsp
<%@ page contentType="text/html;charset=Shift_JIS" import=
"java.util.regex.*" %>
<%!
private String mailSelect(String strVar){
  StringBuffer objSb=new StringBuffer();
  Pattern objPtn=Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);
  Matcher objMch=objPtn.matcher(strVar);
  while(objMch.find()){
    objSb.append(objMch.group() + "<br />");
  }
  return objSb.toString();
}
%>
<%
String strVal ="私のアドレスは、 CQW15204@nifty.com です。";
       strVal+="セカンドアドレスは、 yyamada@mcn.ne.jp です。";
out.println(this.mailSelect(strVal));
%>

画文字列中からメールアドレスのみを順に取り出します 画文字列中からメールアドレスのみを順に取り出します

ロジックの概要

 Pattern#compileメソッドは引数として渡された正規表現パターンを、プログラム中から利用できる形にコンパイルします(本稿では正規表現パターンの詳細については詳述しません。下記の正規表現パターンを参考に、どのようなパターンを表現しているのかを確認してみてください)。

 Pattern#matcherメソッドは引数として渡された文字列について正規表現検索を行い、マッチング結果をMatcherオブジェクトとして返します。Matcherオブジェクトにはマッチング(開始・終了)位置やマッチング文字列などの情報を含みます。

 Matcherオブジェクトに含まれるマッチング文字列は、groupメソッドを介して順に取得することができます。findメソッドは未取得のマッチング結果が存在するかどうかをtrue/falseで返しますので、findメソッドがtrueを返す間(falseを返すまで)whileループを繰り返すことで、全マッチング結果を取得することができます。

正規表現パターンを記述する場合の注意

 Javaで正規表現パターンを記述する場合には、以下の点に注意してください。

(1)「\」は「\\」で記述する

正規表現パターンの中で特別な意味を持つ「\」は、Javaにおいてもエスケープ文字を表す特殊文字です。そのため、「\」は必ず「\\」のようにエスケープしたうえで使用しなければなりません。

(2)J2SE 1.3以前では使用できない

正規表現機能を実現するjava.util.regexパッケージはJ2SE 1.4から導入されました。J2SE 1.3以前ではjava.util.regexパッケージは使用することができませんので、注意してください。J2SE 1.3以前で正規表現機能を使用したいという場合には、Jakarta ORO(http://jakarta.apache.org/oro/)などを導入する必要があります。

 java.util.regexパッケージで使用することのできる正規表現パターンには、以下のようなものがあります。あくまで主要なものの一部にすぎませんが、これらのパターンをマスタするだけでもかなり柔軟な表現が可能となるはずです。

主な正規表現パターン
メソッド 概要
^ 行の最初に一致
$ 行の末尾に一致
. 任意の1文字と一致
[xyz] x、y、zのいずれか
[^xyz] x、y、z以外
[a-zA-Z] a〜z、A〜Z(すべてのアルファベット。大文字小文字は無視)
[a-z&&[^opq]] o、p、qを除くすべてのアルファベット([a-nr-z]と同じ)
X? Xと0または1回一致([0-9]?は、0または1けたの数値と一致)
X* Xと0回以上一致([A-Za-z]*は0けた以上のアルファベットと一致)
X+ Xと1回以上一致([0-9]+は1けた以上の数値と一致)
X{n} Xとn回一致([A-Za-z]{1}はアルファベット2文字と一致)
X{n,} Xとn回以上一致([a-cA-C]{3,}は、A〜C(a〜c)3文字以上と一致)
X{n,m} Xとn〜m回一致([xyz]{2,4}は、x、y、zいずれ2〜4文字と一致)
\t タブ文字
\n ラインフィード
\r キャリッジリターン
\d 数値と一致([0-9]と同意)
\D 数値以外と一致([^0-9]と同意)
\s 空白文字と一致([ \t\n\x0B\f\r]と同意)
\S 空白以外の文字と一致([^\s]と同意)
\w アルファベット、数字、アンダーバーと一致([a-zA-Z_0-9]と同意)
\W アルファベット、数字、アンダーバー以外と一致([^\w]と同意)

正規表現パッケージを用いることで、複雑な文字列パターンを抽出・操作することが可能となります。例えば、Pattren#matcherメソッドは、URLやE-Mailアドレスをフリーのドキュメントから抽出する場合などに強力な効果を発揮します。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。