パターン内の括弧毎にマッチした部分文字列を使って置換

広告

パターンにマッチした文字列を、置換する文字列の中から参照して利用することが可能です。まず置換する文字列として"$0"を指定すると、マッチした部分文字列全体になります。

次の例を見てください。

String str = "Orange is 100yen, Banana is 180yen.";
String regex = "¥¥d.+?yen";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);
String result = m.replaceFirst("_$0_");

今回の場合、最初にパターンにマッチするのは"100yen"です。置換する文字列は"_$0_"となっており、"$0"がマッチした部分文字列全体となりますので、結果的に"_100yen_"に置き換わります。

Orange is _100yen_, Banana is 180yen.

続いて、パターンを括弧を使ってグループ化することで、グループ毎にマッチした部分を個別に取り出すことができます。(「パターン内の括弧毎にマッチした部分文字列を取得」を参照して下さい)。

グループ毎にマッチした部分文字列は、順に"$1"、"$2"と記述することで取り出すことができます。

次の例を見てください。

String str = "Orange is 100yen, Banana is 180yen.";
String regex = "(¥¥d.+?)(yen)";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);
String result = m.replaceFirst("$2_$1");

今回の場合、最初にパターンにマッチするのは"100yen"です。この時、グループ1にマッチするのが"100"、グループ2にマッチするのが"yen"となります。置換する文字列は"$2_$1"となっていますので結果的に"yen_100"に置き換わります。

Orange is yen_100, Banana is 180yen.

このように"$0"でマッチした部分文字列全体、"$1"、"$2"などでグループ毎にマッチした部分文字列を置換の文字列の中で参照することができます。

サンプルプログラム

では実際に試してみます。

JSample2_1.java

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class JSample2_1{
  public static void main(String args[]){
    String str = "Orange is 100yen, Banana is 180yen.";

    String regex = "(¥¥d.+?)(yen)";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(str);

    String result1 = m.replaceAll("'$0'");

    System.out.println("replaceAll(¥"'$0'¥")");
    System.out.println("before : " + str);
    System.out.println("after  : " + result1);

    String result2 = m.replaceAll("$2_$1");

    System.out.println("replaceAll(¥"$2_$1¥")");
    System.out.println("before : " + str);
    System.out.println("after  : " + result2);

    String result3 = m.replaceAll("¥¥¥¥$1");

    System.out.println("replaceAll(¥"¥¥¥¥$1¥")");
    System.out.println("before : " + str);
    System.out.println("after  : " + result3);
  }
}

ではコンパイルを行った上で実行してみます。

p2-1

( Written by Tatsuo Ikura )