Javaでは、次のようにします。
"a/b/c/d".replaceAll("/", "@");
私は戻ってきます
a@b@c@d
しかし、私がそうするとき:
"a/b/c/d".replaceAll("/", File.separator);
StringIndexOutOfBoundsExceptionがスローされますが、その理由はわかりません。これを調べてみましたが、あまり役に立ちませんでした。誰かが私を助けることができますか?
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
_
予想通り。
File.separator
は\
Windowsの場合、つまり;エスケープされた円記号です。ただし、置換文字列では、何か 完全に異なる を意味します。したがって、Java用と置換文字列用の2回エスケープする必要があります。
これは機能するはずです:
"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
これを試して
String str = "a/b/c/d";
str = str.replace("/", File.separator);
str.replace('/', File.separatorChar)
で試してください