javaコーディングでハマった事②

なぜか何回も、同じ事でハマって悩んだ事があるようなことを、おぼえがき

String s = “ababaaa”;

s.replaceAll(“b”, “$”);

上記のソース、replaceAll呼び出したときにIllegalArgumentExceptionもしくは

StringIndexOutOfBoundsExceptionがおきてしまう。

これは、String#replaceAll(Pattern#replaceAll)では内部的に”$”を特殊な文字として扱ってるから。

つまりreplaceAllの第二引数(置き換え後文字列)に”$”は使えない。

検索文字列に正規表現を使わなくても大丈夫なんであれば、

String s = “ababaaa”;

s.replace(“b”, “$”);

でOK。正規表現の検索が行えない代わりに”$”も処理できる。

Allなしのreplaceという名前ではあるけれど、ちゃんと全ての検索対象の置換が行われる。

問題なのは、検索文字列に正規表現を使いたい場合。

“$”にしたい部分をいったん別の目印文字列に置き換えておいてから、

String#replaceで正規表現なしでその目印文字列”$”に置き換える感じかな。

ただしこの場合、目印文字列は、入力パターンからは決して入ってこない文字列である必要がある。

なんか面倒だなぁ・・

もっといい方法があるような気もするけど。。。

Comments are closed.