パターンとマッチした部分文字列を置換する文字列の中で参照する

正規表現を使ってパターンとマッチした文字列を置換する場合に、パターンとマッチした文字列の値を置換する新しい文字列の中で参照し利用することができます。ここでは Java の正規表現で置換する文字列の中でパターンとマッチした文字列を参照する方法について解説します。

(Last modified: )

パターンとマッチした文字列全体を参照する

Matcher クラスの replaceFirst メソッドなどを利用してパターンとマッチした文字列を新しい文字列に置換する場合、置換する新しい文字列を指定する箇所でパターンとマッチした文字列を参照することができます。マッチした文字列全体を参照する場合は $0 を使用してください。

※ $0 は変数ではないので、文字列の中に直接 $0 を記述してください。

次のサンプルをみてください。

// java.util.regex.*のインポートが必要です
import java.util.regex.*;

String regex  = "AA|BB";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher("DD AA CC BB EE");
System.out.println(m.replaceFirst("[$0]")); // DD [AA] CC BB EE

置換する文字列として [$0] と指定しています。例えばパターンが AA とマッチした場合、 [AA] という新しい文字列と置換することになります。このようにマッチした文字列の情報を使って置換する文字列を設定することができます。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample28-1.java という名前で保存します。

import java.util.regex.*;

class JSample28_1{
  public static void main(String[] args){
    String target = "BB AA CC BB";
    System.out.println(target);

    String regex = "\\b[^ ]+\\b";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(target);
    System.out.println(m.replaceAll("[$0]"));
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample28_1.java

その後で、次のように実行してください。

java JSample28_1

パターンとマッチした文字列全体を参照する(1)

パターンとマッチした文字列全体を、置換する文字列の中から参照しました。

正規表現グループ毎にキャプチャした値を参照する

パターンの中に正規表現グループが設定されている場合には、正規表現グループ毎にキャプチャした値を参照することができます。参照するにはグループのインデックスを使用して $1 、 $2 のように使用します。

次のサンプルをみてください。

// java.util.regex.*のインポートが必要です
import java.util.regex.*;

String regex  = "([A-Z]{2})-([0-9]{2})";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher("XA-07");
System.out.println(m.replaceFirst("[$0]")); // 07-XA

パターンの中に正規表現グループを 2 つ設定しています。そして置換する文字列として $2-$1 と指定しています。パターンが文字列にマッチした場合、 1 番目の正規表現グループでキャプチャした値と 2 番目の正規表現グループでキャプチャした値を入れ替えて置換しています。このように正規表現グループごとにキャプチャした値を使って置換する文字列を設定することができます。

※ 正規表現グループについては「正規表現グループを設定してパターンの一部にマッチした文字列を取得する」を参照されてください。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample28-2.java という名前で保存します。

import java.util.regex.*;

class JSample28_2{
  public static void main(String[] args){
    String target = "XA-07 BG-74 AT-35";
    System.out.println(target);

    String regex = "([A-Z]{2})-([0-9]{2})";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(target);
    System.out.println(m.replaceAll("$2:$1"));
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample28_2.java

その後で、次のように実行してください。

java JSample28_2

正規表現グループ毎にキャプチャした値を参照する(1)

正規表現グループ毎にキャプチャした値を、置換する文字列の中から参照しました。

置換する文字列を記述するときにエスケープ処理が必要な文字

ここまで解説してきたように置換する文字列の中では $ は特別な意味を持ちますので、文字として $ を使用したい場合にはバックスラッシュ(\)を使って \$ のようにエスケープを行ってください。

また $ をエスケープするのに使用するバックスラッシュ(\)も特別な意味を持つため、文字としてバックスラッシュを使用したい場合はバックスラッシュを使って \\ のようにエスケープを行ってください。

次のサンプルをみてください。

// java.util.regex.*のインポートが必要です
import java.util.regex.*;

String regex  = "([0-9]+)dollar";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher("100dollar");
System.out.println(m.replaceAll("\\$$1"));  // $100

100dollar を $100 へ置換しようとしています。置換する文字列として最初に文字としての $ を記述するためバックスラッシュでエスケープを行い \\$ と記述します(文字列の中なのでバックスラッシュは 2 つ必要です)。そのあとに正規表現グループでキャプチャした値を参照するために $1 と記述しています。結果として置換する文字列は \\$$1 となります。

-- --

Java の正規表現で置換する文字列の中でパターンとマッチした文字列を参照する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。