なぜか何回も、同じ事でハマって悩んだ事があるようなことを、おぼえがき
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.