Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > 文字列 −7.正規表現
更新日:2005/7/25
文字列−7.正規表現
このページでは、Javaで正規表現を利用する方法について解説します。JavaではJ2SE 1.4から正規表現を処理するjava.util.regexパッケージが追加されました。ここではjava.util.regexパッケージの利用方法について解説します。
概要
正規表現とは文字・記号を利用し、特定の文字パターンを表現することを言います。文字列が文字パターンに合致するかを確認する場合や、 文字列内の文字パターンに合致する部分を変更したりする場合に利用します。

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

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

正規表現の詳細は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の正規表現
    A-1.正規表現のパターンに適合するか確認する文字列text2を
         生成します。
    A-2.compileメソッドで正規表現をコンパイルします。
    A-3.splitメソッドで引数に指定された文字列を正規表現に合
         わせ分割し、分割された文字列を配列で返します。
    A-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の正規表現
    B-1.正規表現のパターンに適合するか確認する文字列text3を
         生成します。
    B-2.compileメソッドで正規表現をコンパイルします。
    B-3.matcherメソッドで引数に正規表現の適合を確認する文字
         列を指定し、Matcherオブジェクトを生成します。
    B-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の正規表現
    C-1.正規表現のパターンに適合するか確認する文字列text4を
         生成します。
    C-2.compileメソッドで正規表現をコンパイルします。
    C-3.matcherメソッドで引数に正規表現の適合を確認する文字
         列を指定し、Matcherオブジェクトを生成します。
    C-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の正規表現
    D-1.正規表現のパターンに適合するか確認する文字列text5を
         生成します。
    D-2.compileメソッドで正規表現をコンパイルします。
    D-3.matcherメソッドで引数に正規表現の適合を確認する文字
         列を指定し、Matcherオブジェクトを生成します。
    D-4.findメソッドで正規表現に適合するかを調査します。
    D-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>

主なメソッド
【Patternクラス】
戻り型
メソッド
説明
static Pattern
compile(String)
引数に指定された正規表現をコンパイルします。
static Pattern
compile(String, int)
引数に指定された正規表現をコンパイルします。第2引数にフラグを指定し、細かな適合動作を指定します。フラグを指定した場合、処理パフォーマンスが低下する場合があります。

CASE_INSENSITIVE
US-ASCII文字において、大文字・小文字を区別しない適合処理を行います。
MULTILINE
複数行をサポートします。
DOTALL
正規表現.は行末記号を含む任意の文字に適合します。
UNICODE_CASE
CASE_INSENSITIVEと合わせて利用すると、US-ASCII文字に合わせてUNICODE文字でも、大文字・小文字を区別しない適合処理を行います。
CANON_EQ
標準等価を有効にした適合処理を行います。
Matcher
matcher(CharSequence)
引数に指定された文字シーケンス(String、StringBufferなど)と該当パターンに対するMatcherオブジェクトを生成します。
String[ ]
split(CharSequence)
引数に指定された文字シーケンス(String、StringBufferなど)を該当パターンに適合し、分割します。
String[ ]
split(CharSequence, int)
引数に指定された文字シーケンス(String、StringBufferなど)を該当パターンに適合し、分割します。第2引数の数値は分割数を指定します。
【Matcherクラス】
戻り型
メソッド
説明
Matcher
appendReplacement (StringBuffer, String)
正規表現に適合するかを順番に調査し適合した場合、その部分を第2引数の文字列に置き換え、第1引数の文字列バッファに追加します。
StringBuffer
appendTail(StringBuffer)
正規表現の適合調査を行っていない残りの文字シーケンスを引数に指定した文字列バッファに追加します。appendReplacementメソッドと一緒に利用します。
boolean
find( )
正規表現に適合するか順番に調査します。
boolean
find(int)
引数に指定されたインデックス位置から、正規表現に適合するか順番に調査します。
String
group( )
前回正規表現に適合した文字列を返します。
String
group(int)
前回正規表現に適合した文字列の内、引数に指定された正規表現グループ( )に合致する文字列を返します。グループ( )は正規表現の左から、1、2となります。0を指定した場合は、gourp( );を実行した場合と同様の結果になり、正規表現に適合した文字列全体を返します。
boolean
matches( )
正規表現に適合するか調べ、適合する場合trueを返します。
String
replaceAll(String)
正規表現に適合するすべての文字列を、引数に指定した文字列に置き換えます。
String
replaceFirst(String)
正規表現に適合するすべての文字列の内、最初の文字列を引数に指定した文字列に置き換えます。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道