3

私は次のコードを試しています:-

String x = "asdfg/dgws";
x.replaceAll("/", "\\");

しかし、これは失敗しています。これにより、次のエラーメッセージが表示されます。-

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
    at java.lang.String.charAt(Unknown Source)
    at java.util.regex.Matcher.appendReplacement(Unknown Source)
    at java.util.regex.Matcher.replaceAll(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at com.jai.SecLargest.main(SecLargest.java:13)

この例外が発生する理由がわかりません。

4

3 に答える 3

20

String.replaceAllドキュメントにMatcher.replaceAllこれが含まれています:

置換文字列にバックスラッシュ () とドル記号 ($) を使用すると、リテラル置換文字列として扱われる場合とは結果が異なる場合があることに注意してください。上記のように、ドル記号はキャプチャされたサブシーケンスへの参照として扱われる場合があり、バックスラッシュは置換文字列内のリテラル文字をエスケープするために使用されます。

AlexR の回答に従ってバックスラッシュをエスケープできますが、replace代わりに使用することを強くお勧めします。

String y = x.replace('/', '\\');

それはより明確です、IMO-正規表現を介してパターンを表現しようとreplaceAllしている場合を除き、使用しないでください。

また、書かれたコードはノーオペレーションになることにも注意してください。文字列は Java では不変であるため、このメソッド (および同様のメソッド) は、変更が加えられた新しい文字列replaceAllへの参照を返します。

于 2012-06-04T07:32:58.667 に答える
8

言うべきx.replaceAll("/", "\\\\");

バックスラッシュ\は 2 回エスケープする必要があります。1 回は正規表現エンジン用、もう 1 回は Java 自体用です。

于 2012-06-04T07:30:39.987 に答える