web-dev-qa-db-ja.com

すべての「/」をFile.separatorに置き換えます

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

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

私は戻ってきます

    a@b@c@d

しかし、私がそうするとき:

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

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

15
tomato

documentation :にあると書いてあります。

置換文字列の円記号(\)とドル記号($)により、文字通りの置換文字列として扱われていた場合とは結果が異なる場合があることに注意してください。 _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のものであるため、_\\_を直接使用するのではなく、sepでリテラル_File.separator_を使用していることに注意してください。

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

この出力:

_a\b\c\d
_

予想通り。

23
paxdiablo

File.separator\ Windowsの場合、つまり;エスケープされた円記号です。ただし、置換文字列では、何か 完全に異なる を意味します。したがって、Java用と置換文字列用の2回エスケープする必要があります。

これは機能するはずです:

"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
9
nullpotent

これを試して

    String str = "a/b/c/d";
    str = str.replace("/", File.separator);
8
Smit

str.replace('/', File.separatorChar)で試してください

0
fmartelli