memorandums

日々のメモです。

文字列中に正規表現のメタ文字が含まれていた場合のreplaceメソッド

長いタイトルですが、そのまんまの意味です。

これについて書かれているエントリーはたくさんありますが、自分が忘れないために書きます。

あるプログラムを作っています。

Javaで書かれたソースコード中の文字列をStringクラスのreplaceAllメソッドで変換しようしたところエラーが。

replaceメソッドの第一引数は正規表現で記述します(というかできます)。

そのため単なる文字列ではなくメタ文字で指定できて便利なのですが、メタ文字が含まれた文字、例えばコメントである「/**」を第一引数に指定するとPatternSyntaxExceptionがでます。

あれこれ調べるとPatternクラスのクラスメソッドquoteを使うとメタ文字を普通の文字として処理させることができるようです。

ふむふむ。

例えば、以下のようなプログラムです。これはエラーがでます。

String str = "/** aaaaa */";

str = str.replaceAll("/**", "xx");

System.out.println(str);

で、quoteでくくります。

String str = "/** aaaaa */";

str = str.replaceAll(java.util.regex.Pattern.quote("/**"), "xx");

System.out.println(str);

これでうまく痴漢じゃなかった置換してくれます。

めでたし、めでたし。

ちなみに、同じくStringクラスにindexOfという文字列中の位置を教えてくれるメソッドがありますが、こちらはquoteは必要ありません。正規表現の指定ではないので当然といえば当然ですが。