7

Javaの次のコードフラグメント:

"\\\\".replaceAll("\\\\", "\\");

例外をスローします:

java.lang.StringIndexOutOfBoundsException: String index out of range: 1 (NO_SOURCE_FILE:0)

replaceAllのjavadocには、円記号の使用に関する警告が含まれており、Matcher.replaceAllまたはMatcher.quoteReplacementの使用を推奨しています。文字列内の2つのバックスラッシュのすべての出現を1つのバックスラッシュに置き換える方法に関するスニペットを持っている人はいますか?

明確化

上に示した実際のリテラルは単なる例であり、実際の文字列には、異なる場所で2つの連続した円記号が何度も出現する可能性があります。

4

4 に答える 4

13

あなたは簡単にそれを行うことができますString#replace(): -

"\\\\".replace("\\\\", "\\")

String#replaceAllregexas パラメータを取ります。したがって、backslash2回エスケープする必要があります。のために一度Java、次にのためにRegex。したがって、使用する実際の置換は次のreplaceAllようになります。

"\\\\".replaceAll("\\\\\\\\", "\\\\")

しかし、あなたは本当にここを必要としませんreplaceAll

于 2013-02-01T15:57:09.410 に答える
1

代わりにこれを試してください:

"\\\\".replaceAll("\\{2}", "\\")

toの最初のパラメーターreplaceAll()は正規表現であり{2}、charの2つのオカレンスが一致する必要があることを示します。

于 2013-02-01T16:00:13.730 に答える
0

使用したい場合はMatcher.replaeAll()、次のようなものが必要です。

Pattern.compile("\\\\\\\\").matcher(input).replaceAll("\\\\");
于 2013-02-01T15:58:42.307 に答える
0

置換文字列にバックスラッシュがあると、エスケープ文字として扱われ、メソッドは次の文字を読み取ろうとします。そのため、StringIndexOutOfBoundsException をスローしています。

于 2013-02-01T16:07:21.723 に答える