置換の時のエスケープ処理

広告

前のページで確認したとおり、置換する文字列の中で"$0"や"$1"と記述すると特別な意味を持ちます。そこで置換する文字列の中で"$"を単なる文字として使いたい場合には"¥"を使って"¥$"と記述して下さい。

次の例を見てください。

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

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

今回の場合、最初にパターンにマッチするのは"100dollar"です。置換する文字列は"¥¥$$1"となっており、"¥¥$"が文字としての"$"であり、"$1"がグループ1にマッチした部分文字列となりますので、結果的に"$100"に置き換わります。

Orange is $100, Banana is 180dollar.

またエスケープに使用される"¥"も置換する文字列の中で特別な意味を持つことになるので、単なる文字として"¥"を使いたい場合も"¥"を使って"¥¥"として下さい。

次の例を見てください。

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

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

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

Orange is ¥100, Banana is 180yen.
パターンとしては"¥¥"ですが、Javaの文字列の中で"¥"記号はエスケープして"¥¥"と記載する必要があるため、このパターンを文字列の中に記述する場合は"¥"一つにつき"¥¥"となるので"¥¥¥¥"と記述する必要があります。

サンプルプログラム

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

JSample3_1.java

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

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

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

    Matcher m = p.matcher(str);

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

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

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

p3-1

( Written by Tatsuo Ikura )