Java では、次のようにします。
"a/b/c/d".replaceAll("/", "@");
私は戻ってきます
a@b@c@d
しかし、私がするとき:
"a/b/c/d".replaceAll("/", File.separator);
StringIndexOutOfBoundsException がスローされますが、その理由はわかりません。これを調べてみましたが、あまり役に立ちませんでした。誰でも私を助けることができますか?
それはドキュメントのすぐそこにあると言っています:
置換文字列にバックスラッシュ (\) とドル記号 ($) を使用すると、リテラル置換文字列として扱われる場合とは結果が異なる場合があることに注意してください。を参照してください
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
予想通り。
これを試して
String str = "a/b/c/d";
str = str.replace("/", File.separator);
File.separator
つまり\
、Windows上にあります。エスケープされたバックスラッシュです。ただし、置換文字列では、まったく別の意味になります。したがって、Java 用に 1 回、置換文字列用に 1 回、2 回エスケープする必要があります。
これはうまくいくはずです:
"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));