- ベストアンサー
連続する「\」をひとつの「\」にReplaceするには
JAVA初心者です。 javaのStringクラスについての質問です。 ファイルパス「C:\\Test\\Out\\test.txt」 が入っているString変数w_Filenameの 「\\」を「\」にreplaceしてファイル出力したいのですが、 w_Filename.replaceAll("\\\\","\\") とやると、 java.lang.StringIndexOutOfBoundsException: String index out of range: 1 とエラーになってしまいます。 どうしたらいいのでしょうか?教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
前の回答では「replaceAll メソッドがこの例外を投げるはずはありません」と書きましたが、実際はそうでもないようです。 API仕様ドキュメントを注意深く読むと、置換する文字列においてバックスラッシュはエスケープ文字として扱われることと、IndexOutOfBoundsExceptionがスローされる可能性があることがかなり遠回しに書いてあります。(私も最初は気づきませんでした) それに従うと、replaceAllメソッドに与える引数の2番目は、\ ではなく \\ となりますので、それをソースコート上で表すには "\\" ではなく "\\\\" とすることになります。 結局、 replaceAll("\\\\\\\\", "\\\\"); が正解のようです。
その他の回答 (2)
- UKY
- ベストアンサー率50% (604/1207)
w_Filename.replaceAll("\\\\","\\") じゃなくて w_Filename.replaceAll("\\\\\\\\","\\") ですね。 前者では文字列中の一つのバックスラッシュを一つのバックスラッシュに置換するだけで、結局何も変わりません。 二つのバックスラッシュ文字を表す正規表現は \\\\ です。それをソースコード中の文字列として表すには、 "\\\\\\\\" とする必要があります。 ところで、StringIndexOutOfBoundsException はどこで発生していますか? replaceAll メソッドがこの例外を投げるはずはありません。おそらく、StringIndexOutOfBoundsException は replaceAll とは無関係です。
お礼
親切な回答、どうもありがとうございました。 色々なことが間違えているかもしれません。。。 理解もしないで質問をしてすいませんでした。 ちなみに、エラーメッセージの上5行は以下の通りでした。もう少し勉強します。ありがとうございました。 java.lang.StringIndexOutOfBoundsException: String index out of range: 1 at java.lang.String.charAt(String.java:444) at java.util.regex.Matcher.appendReplacement(Matcher.java:551) at java.util.regex.Matcher.replaceAll(Matcher.java:661) at java.lang.String.replaceAll(String.java:1663)
- yotta
- ベストアンサー率32% (26/79)
何をしたいのか,今ひとつ解りませんが \ はエスケープコードといって特殊なコードです ソース上では "\\" となっていますが コンパイルすると "\" の1文字に変換されます なので 「C:\\Test\\Out\\test.txt」を 「C:\Test\Out\test.txt」と変えると 「C:(TAB)est(??)ut(TAB)est.txt」 \T , \t : TAB 0x09 \O : ないので NUL? 0x00 となってしまい,エラーになります
お礼
意味のわからない質問にわざわざ回答いただき、どうもありがとうございました。 エスケープは分かっているつもりだったのですが、理解不十分だと再認識しました。また、勉強しなおします。ありがとうございます。
お礼
回答、ありがとうございます。 無事、教えていただいた方法でできました。 初心者の私にもわかりやすく、なぜそうなるかまで説明していただいて、本当に感謝いたします。 じっくりしくみを理解しながらプログラム作成する大切さも教えていただいた気がします。 ありがとうございました!!