- 締切済み
エスケープ文字の扱いについて
よろしくお願いします。 replaceAll関数を用いて、文字列を変換しようと考えているのですが「$」文字の扱いで困っています。 具体的には、文字列中に「$」を見つけたら「\$」に変換したいのですが、 例)「ab$c」なら、「ab\$c」に str.replaceAll("\\$","\\\\$") などいろいろ試してみてもうまくいきません。 どなたかご教授下さい。 よろしくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kacchann
- ベストアンサー率58% (347/594)
結論からいえば、 String#replaceAll()の第二パラメータ(String)内に 格納される文字のうち、「\」と「$」は (replaceAll()内部処理で)「特殊文字」として扱われるので、 気をつける必要がある。 --- では試しに、「$」を「\$」に置換するプログラムを書いてみる。 final String s = "ab$cd"; final String reg = "\\$"; //↑望む正規表現は「\$」だ。この2つの文字をそれぞれ、 //String型の1文字目と2文字目に入れればよい。 //そのためには(コンパイラを通過させるためには) //reg = "\\$";//(※「\」のみ2重にする) //とする。 replacement = "\\\\\\$"; //↑「置き換えたい文字列」は「\$」だ。(文字「\」と文字「$」を //そのまま印字したい)。 //しかし、メソッドreplaceAll()は、その内部処理で、 //第2ひき数の中の文字列(※文字の配列)の中に格納されいる「$」を //「特別な記号」と解釈する。 //つまり第二引数の文字列中に、 //単独に「$」が入っていると、 //メソッドreplaceAll()はその文字を「印字すべき文字」(リテラル、 //と言うのか?)とは認識しない。 //「印字すべき文字」と認識させるには、 //第二引数の文字列中に「\」と「$」を「続けて」格納する。 //同様に、「\」もそのままでは特殊文字とみなされるので、 //これを「印字すべき文字」と認識させるには、 //第二引数の文字列中に「\」を「\」を続けて格納する //結局、「置き換えたい文字列」が「\$」(文字「\」と文字「$」を //そのまま印字したい)の場合、 //上記の理由により、 //第二引数には「\」「\」「\」「$」の4文字を順に格納すればよい。 //そのためには(コンパイラを通過させるためには) //replacement = "\\\\\\$"; //(※「\」のみ2重にする) //とする。 //ちゃんと置換されてるかな? System.out.println(s.replaceAll(reg, replacement)); --- どっかでとんでもないミスしてたらゴメン。 --- http://oshiete1.goo.ne.jp/kotaeru.php3?q=928785 の#3さんの回答を参照。 あと http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/regex/Matcher.html の appendReplacement() の 「置換文字列には、前回のマッチ時に…」 からはじまる段落も参照。