文字列の置き換えを行う方法 (replaceAllで気をつけること)

Java の String クラスには置換メソッドとして replaceAll() メソッドが用意されています。
文字列に指定した文字列が存在した場合に、指定した別の文字列に置換を行います。

String str1 = "今日の天気は晴れです。";
String str2 = "晴れ";
String str3 = "雨";

str1.replaceAll(str2, str3);

replaceAll() は内部で正規表現を行い、置換処理を実現しています。
このため次の例はあっているように動作しますが、厳密には間違っています。

String str1 = "../test.html";
String str2 = "../";
String str3 = "http://www.example.com/";

str1.replaceAll(str2, str3);

置き換える対象の文字列が

String str1 = "http://www.example.com/test.html";

であった場合、正規表現の『 . (ドット)』は任意の1文字のため

http://www.example.chttp://www.example.com/test.html

と置き換えられます。

つまり正しくは次のようになります。

String str1 = "../test.html";
String str2 = "\\.\\./";
String str3 = "http://www.example.com/";

str1.replaceAll(str2, str3);

Javaで正規表現のエスケープを行うには Pattern.quote(str)を使用します。

import java.util.regex.Pattern;

String str1 = "../test.html";
String str2 = "../";
String str3 = "http://www.example.com/";

str1.replaceAll(Pattern.quote( str2 ), str3);

Pattern.quote は文字列中の正規表現記号それぞれをエスケープシーケンスでエスケープするのではなく、正規表現エスケープの開始記号¥Qと終了記号¥Eで囲うだけです。
つまり次のものと同義です。

str1.replaceAll("\\Q" + str2 + "\\E" , str3);

関連記事

スポンサーリンク

lprm 印刷キュー内の印刷ジョブを取り消す

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る