J2SE 1.4から、JavaでもPerlのそれに準じた正規表現によるパターンマッチングができるようになりました。
正規表現関連のクラス定義はパッケージ
java.util.regexにまとめて収められており、便利に活用できます。
●1行マッチング
ある文字列がある正規表現パターンに適合するかどうかを知るには、簡単には次のようにします。
import java.util.regex.*;
/* ... */
boolean b = Pattern.matches("H.*d", "Hello, World");
|
java.util.regex.Pattern
クラスのクラスメソッド matches() は、1番目の引数の正規表現に、
2番目の引数の文字列が適合するかどうかを返します。
ここでmatches()の場合は文字列全体が正規表現にマッチしないと真になりません。
文字列の途中から正規表現にマッチした場合も真とするには
find()、文字列の先頭からマッチしなければ真とならないようにしたければ lookingAt()
というメソッドが用意されています。
この matches()、find()、lookingAt()の3つの使い分けが肝心ということですね。
上記の方法でもよいのですが、それは1回のマッチングごとに正規表現を文字列から解析
(コンパイル)するので、同じ正規表現にたくさんの文字列をマッチングさせる場合はパフォーマンスが悪いです。
そこで、そのような場合は、
正規表現を前もって1回だけコンパイルしておき、
その「正規表現オブジェクト」に対して文字列を順番に照合する方法がとられます。
import java.util.regex.*;
/* ... */
String[] fileNames = {"...", "..." /*, ... */};
Pattern p = Pattern.compile(".*([0-9]{8}).*\\.pdf$");
for(int i=0; i<list.length; i++){
Matcher m = p.matcher(fileNames[i]);
if(m.matches()){
System.out.println("適合した部分文字列:" + m.group(1);
}
}
|
今度はjava.util.regex.Matcherクラスのオブジェクトを、
java.util.regex.Pattern.matcher() メソッドから取り出しています。
Matcher オブジェクトの matches()、
または lookingAt()、find()メソッドが真を返すと、マッチしたという意味になります。
Matcher.group() メソッドは、
正規表現に括弧()で囲まれた部分があった場合、
その位置に適合した文字列(部分文字列)を返します。
正規表現の中に括弧()で囲まれた部分が複数回あった場合、
m.group(1) が最初の部分文字列を返し、
m.group(2) が二番目の部分文字列を返し、…以下同様となります。
m.group(0) は正規表現全体にマッチした文字列を返します。
Javaの正規表現で注意が必要な点は、
一般にあらゆる1文字にマッチするとされるドット「.」は、
デフォルトでは改行文字にはマッチしないことです。
改行文字も含めて「.」にマッチさせるには、
2番目の引数として各種のフラグをとれるPattern.compile()を使い、
記号定数DOTALLを渡します。
private static final String SELECT_REGEXP = "SELECT\\s+(\\w.*)\\s+FROM\\s+(\\w+)";
private static final Pattern SELECT_PATTERN = Pattern.compile(SELECT_REGEXP, Pattern.DOTALL);
|
(first uploaded 2002/08/16 last updated 2007/02/27, URANO398 - KQ TAURA)
|