string を持っているがa"b"c"
、取得したい場合a\"b\"c\"
、自然に書くでしょう
String t = "a\"b\"c\"";
t = t.replaceAll("\"", "\\\"");
ただし、同じ文字列a"b"c"
. 正しい方法は
t.replaceAll("\"", "\\\\\"");
なんで?
replaceAll
パターンと置換の両方に正規表現を使用します。どちらもバックスラッシュをエスケープする必要があります。したがって、2 番目の引数に必要な正規表現置換パターンは次のとおりです。
\\"
\
とJava"
の文字列リテラルもエスケープする必要があるため、これらの各文字には追加のバックスラッシュが必要です。引用符を追加すると、次のようになります。
"\\\\\""
これは、ソースにあるものです。
正規表現を使わずString.replace
に which を使えば簡単です。そうすれば、この文字列 (文字列リテラルではなく) を 2 番目の引数として提供しようとしているだけです。
\"
エスケープして文字列リテラルに変換すると、次のようになります。
"\\\""
これはまだ素晴らしいとは言えませんが、少なくとも改善されています。
別の方法は、次のように使用することreplaceAll
ですMatcher.quoteReplacement
。
t = t.replaceAll("\"", Matcher.quoteReplacement("\\\""));
個人的には、私はただ使用したいと思いreplace()
ます。結局のところ、正規表現の置換は必要ありません。