Illegal group reference

自前のサイトで今までにない例外(Illegal group reference)が発生していたので調査していたら、どうも「replaceAll」によるものみたい。

文字列の置換は「replace」と「replaceAll」の二つがあるのだけど、replaceだと最初の一文字だけ置換かと思って、いままではすべて変換は「replaceAll」を使っていた。
でもどうもどちらもすべて変換してくれるようです。

違いは、replaceは正規表現ではなく、replaceAllは正規表現であるということみたいです。

では、なぜ「replaceAll」は上記例外が発生しているか?
それは置換後文字列に「$」が入っているためでした。
正規表現では、「(」と「)」で結ばれた文字を、置換後文字列の「$1」「$2」で置き換えるということができるのでそのために「$」を検出したら置き換えをしようとしている模様。
「$」の後ろが数字じゃなかったら無視とかできないのだろうか・・・
または「(」や「)」がなかったら無視とか・・・。とjava内部のことに文句を言ってもしかたがないので「replace」を利用するか、replaceで置換元を「\\$」に置換してから「replaceAll」するしか方法がないもよう。

参考ページ
http://d.hatena.ne.jp/srkzhr/20090529/1243614146
http://app.dimage.co.jp/atblog/trackback/4d2e7bd33c4757841199381a64e43e50922f