regular expression

■正規表現 regular expression

□java.util.regex
正規表現の処理用クラスのパッケージ
→Jakarta Oro、Jakarta Regexpに相当

□java.util.regexの使い方
①正規表現の文字列を基にPatternオブジェクトを作成
②そこから正規表現検索エンジンであるMatcherオブジェクトを作成
③Matcherオブジェクトのメソッドを呼び出して必要な処理を実行

□使い方(詳細)
------------------------------
①正規表現の文字列を基にPatternオブジェクトを作成
正規表現そのものは文字列で表現されている→正規表現に変換(compile-method)してPatternオブジェクトを作成する。

String regexString = "[a-zA-Z_][a-zA-Z_0-9]*";
Pattern pattern = Pattern.compile(regexString); //Patternのcompileメソッドを呼んでPatternオブジェクトに変換

※[a-zA-Z_][a-zA-Z_0-9]* = 先頭が英字(アンダースコアを含む)で、2文字目以後は英数字で長さが1以上の文字列
------------------------------
②そこから正規表現検索エンジンであるMatcherオブジェクトを作成
正規表現でパターンマッチングを行いたい対象を指定して、正規表現検索エンジンであるMatcherオブジェクトを生成する。
パターンマッチングを行いたい対象はCharSequenceインタフェースを実装している必要があるが、
java.lang.Stringやjava.lang.StringBuffer、java.nio.CharBufferといったクラスがCharSequenceを実装しているので、これらを利用する。

String target = "まずはPATTERNオブジェクトの作成。次にMATCHERオブジェクトを作成。";
Matcher matcher = pattern.matcher(target);
------------------------------
③Matcherオブジェクトのメソッドを呼び出して必要な処理を実行
対象文字列を前から順に調べる。
Matcherオブジェクトはどこまで調べたかを憶えておいてくれるので、find()メソッドがfalseになるまでループにしておけば、対象文字列の最後まで調べることが可能。
ここでは、"PATTERN"と"MATCHER"の2つが正規表現にマッチする部分になる。
正規表現にマッチする部分を標準出力に出す場合は、以下のようになる。

while (matcher.find()) {
System.out.println(matcher.group());
}
------------------------------

□正規表現のパターン参照
正規表現には()を使ってパターンを参照する機能がある。
上記の正規表現文字列を、"([a-zA-Z_])([a-zA-Z_0-9]*)"としてみる。
これは先頭文字とそれ以後の文字列それぞれの部分を参照できるようにしている。
groupメソッドにintの引数を指定することで、この括弧の中にアクセスできる。

group(0)はgroup()と同じ文字列、つまりパターン全体を返す。
それ以後はパターン内の左括弧が現れる順に参照することができる。
即ちgroup(1)は最初の括弧で囲まれる部分、上記の正規表現なら先頭文字の部分を返し、group(2)はそれに続く文字列を返します。
引数にいくらまで番号を指定できるかはgroupCount()メソッドで知ることができる。

while (matcher.find()) {
System.out.println(matcher.group());
int n = matcher.groupCount();
System.out.println(n);
for (int i = 0; i <= n; i++) {
System.out.println(i + ":" + matcher.group(i));
}
}

□Matcherのメソッド
*matches(マッチ)
matchesによって、入力シーケンス全体が正規表現に一致するかどうかを調べる。
*find(検索)
入力シーケンスが正規表現にマッチする文字列を含むかどうかを調べる。
*replaceAll(置換)
入力シーケンスを検索し、正規表現とマッチする部分を指定した文字列で置換し、その結果の文字列を返す。


ref:
http://www5b.biglobe.ne.jp/~psoft/lesson/regex1.html
http://www.atmarkit.co.jp/fjava/javatips/108java016.html
2007-09-21 00:28 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud