2011年5月31日火曜日

Java正規表現

正規表現とは文字・記号を利用し、特定の文字パターンを表現することを言います。文字列が文字パターンに合致するかを確認する場合や、 文字列内の文字パターンに合致する部分を変更したりする場合に利用します。

正規表現例1
正規表現内の*は直前の文字が0回以上続くことを表します。a*baabaaaaaabの文字パターンを表します。

正規表現例2
正規表現内の[][]内の任意の1文字が含まれることを表します。a[xyz]aaxaayaの文字パターンを表します。

正規表現の詳細はjava.util.regexパッケージのJava APIドキュメントをご参照ください。

 


 

java.util.regexパッケージはPatternクラス、Matcherクラスで構成されています。
Pattern
クラスでは正規表現をコンパイルし、正規表現処理を行うMatcherクラスのオブジェクトを生成します。
Matcher
クラスでは正規表現処理(文字列が正規表現にマッチするか、正規表現にマッチした文字列の置換など)を行うメソッドが用意されています。

Patternクラス」
compile
メソッド
引数に正規表現を指定し、正規表現をコンパイルします。

matcher
メソッド
引数に正規表現処理の対象となる文字列を指定し、Matcherクラスのオブジェクトを生成します。

split
メソッド
引数に指定された文字列を正規表現にあわせ分割し、分割された文字列を配列で返します。

Matcherクラス」
replaceAll
メソッド
正規表現に合致する文字列を引数に指定した文字列にすべて置換します。

appendReplacement
メソッド
正規表現に合致する文字列を引数に指定した文字列に1箇所づつ置換します。

matches
メソッド
文字列が正規表現に合致するかを調べます。

find
メソッド
文字列が正規表現に合致するか、順番に調べます。

group
メソッド
正規表現に合致した文字列を返します。

 

 

プログラム例

ExRegex.java

 

import java.util.regex.*;
 
public class ExRegex {
  public static void main(String[] args) {
    /* パターン1の正規表現
    �-1.正規表現のパターンに適合するか確認する文字列text1を
         生成します。
    �-2.compileメソッドで正規表現をコンパイルします。
    �-3.matcherメソッドで引数に正規表現の適合を確認する文字
         列を指定し、Matcherオブジェクトを生成します。
    �-4.matchesメソッドで正規表現に適合するかを確認します。
         適合する場合trueを返します。 */
    String text1 = new String("java1 java2 java3");
    Pattern pattern1 = 
      Pattern.compile("(java\\d)\\s(java\\d)\\s(java\\d)");
    Matcher matcher1 = pattern1.matcher(text1);
    System.out.println(matcher1.matches());
    System.out.println("---------------" + "\n");
 
    /* パターン2の正規表現
    �-1.正規表現のパターンに適合するか確認する文字列text2を
         生成します。
    �-2.compileメソッドで正規表現をコンパイルします。
    �-3.splitメソッドで引数に指定された文字列を正規表現に合
         わせ分割し、分割された文字列を配列で返します。
    �-4.分割された文字列をforループを使用し、表示します。 */
    String text2 = new String("java1 java2 java3");
    Pattern pattern2 = Pattern.compile("\\s");
    String[] splitStr = pattern2.split(text2);
    for (int i = 0; i < splitStr.length; i++) {
      System.out.println(splitStr[i]);
    }
    System.out.println("---------------" + "\n");
 
    /* パターン3の正規表現
    �-1.正規表現のパターンに適合するか確認する文字列text3を
         生成します。
    �-2.compileメソッドで正規表現をコンパイルします。
    �-3.matcherメソッドで引数に正規表現の適合を確認する文字
         列を指定し、Matcherオブジェクトを生成します。
    �-4.replaceAllメソッドで正規表現に適合する文字列すべて
         を、引数に指定した文字列に置き換えます。 */
    String text3 = new String("java1 java2 java3");
    Pattern pattern3 = Pattern.compile("java");
    Matcher matcher3 = pattern3.matcher(text3);
    System.out.println(matcher3.replaceAll("road"));
    System.out.println("---------------" + "\n");
 
    /* パターン4の正規表現
    �-1.正規表現のパターンに適合するか確認する文字列text4を
         生成します。
    �-2.compileメソッドで正規表現をコンパイルします。
    �-3.matcherメソッドで引数に正規表現の適合を確認する文字
         列を指定し、Matcherオブジェクトを生成します。
    �-4.findメソッドで正規表現に適合する文字列があるかを順
         番に調査します。
         appendReplacementメソッドで文字列を順番に第2引数に
         指定した文字列に置き換え、第1引数の文字列バッファに
         追加します。
         appendTailメソッドは特定位置以降の文字列を引数に指
         定された文字列バッファに追加します。
         findメソッド、appendReplacementメソッド、appendTail
         メソッドを使用し、replaceAllメソッドと同様の動作を
         行います。 */
    String text4 = new String("java1 java2 java3");
    Pattern pattern4 = Pattern.compile("java");
    Matcher matcher4 = pattern4.matcher(text4);
    StringBuffer appStrBuf = new StringBuffer();
    while (matcher4.find()) {
      matcher4.appendReplacement(appStrBuf, "road");
    }
    matcher4.appendTail(appStrBuf);
    System.out.println(appStrBuf.toString());
    System.out.println("---------------" + "\n");
 
    /* パターン5の正規表現
    �-1.正規表現のパターンに適合するか確認する文字列text5を
         生成します。
    �-2.compileメソッドで正規表現をコンパイルします。
    �-3.matcherメソッドで引数に正規表現の適合を確認する文字
         列を指定し、Matcherオブジェクトを生成します。
    �-4.findメソッドで正規表現に適合するかを調査します。
    �-5.groupメソッドで前回の適合調査で適合した文字列を返し
         ます。groupメソッドの引数に指定された数値は正規表現の
         グループ()を表します。グループに合致する文字列を返し
         ます。グループは正規表現の()の左から1、2、3となります。*/
    String text5 = new String("java1 java2 java3");
    Pattern pattern5 = 
      Pattern.compile("(java\\d)\\s(java\\d)\\s(java\\d)");
    Matcher matcher5 = pattern5.matcher(text5);
    if (matcher5.find()) {
      System.out.println(matcher5.group(0));
      System.out.println(matcher5.group(1));
      System.out.println(matcher5.group(2));
      System.out.println(matcher5.group(3));
    }
    System.out.println("---------------" + "\n");
  }
}

【実行結果】

 

C:\source>javac ExRegex.java

C:\source>java ExRegex
true   ←パターン1の実行結果
---------------

java1 java2 java3   ←パターン2の実行結果
---------------

road1 road2 road3   ←パターン3の実行結果
---------------

road1 road2 road3   ←パターン4の実行結果
---------------

java1 java2 java3   ←パターン5の実行結果
java1
java2
java3
---------------

C:\source>

 

0 件のコメント:

コメントを投稿