17

Java では、次のようにします。

    "a/b/c/d".replaceAll("/", "@");

私は戻ってきます

    a@b@c@d

しかし、私がするとき:

    "a/b/c/d".replaceAll("/", File.separator);

StringIndexOutOfBoundsException がスローされますが、その理由はわかりません。これを調べてみましたが、あまり役に立ちませんでした。誰でも私を助けることができますか?

4

4 に答える 4

29

それはドキュメントのすぐそこにあると言っています:

置換文字列にバックスラッシュ (\) とドル記号 ($) を使用すると、リテラル置換文字列として扱われる場合とは結果が異なる場合があることに注意してください。を参照してくださいMatcher.replaceAll

そして、でMatcher.replaceAll

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

必要なことは、次のように、置換文字列に含まれるエスケープ文字をエスケープすることですMatcher.quoteReplacement()

import java.io.File;
import java.util.regex.Matcher;

class Test {
    public static void main(String[] args) {
        String s = "a/b/c/d";
        String sep = "\\"; // File.separator;
        s = s.replaceAll("/", Matcher.quoteReplacement(sep));
        System.out.println(s);
    }
}

私のセパレーターはUNIXのものであるため、直接使用するのではなく、リテラルを使用していることに注意してください\\-使用できるはずです:sepFile.separator

s = s.replaceAll("/", Matcher.quoteReplacement(File.separator));

これは以下を出力します:

a\b\c\d

予想通り。

于 2012-12-05T01:23:41.753 に答える
10

これを試して

    String str = "a/b/c/d";
    str = str.replace("/", File.separator);
于 2012-12-05T01:12:04.670 に答える
9

File.separatorつまり\、Windows上にあります。エスケープされたバックスラッシュです。ただし、置換文字列では、まったく別の意味になります。したがって、Java 用に 1 回、置換文字列用に 1 回、2 回エスケープする必要があります。

これはうまくいくはずです:

"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
于 2012-12-05T01:13:32.687 に答える