1

string を持っているがa"b"c"、取得したい場合a\"b\"c\"、自然に書くでしょう

String t = "a\"b\"c\"";
t = t.replaceAll("\"", "\\\"");

ただし、同じ文字列a"b"c". 正しい方法は

t.replaceAll("\"", "\\\\\"");

なんで?

4

1 に答える 1

7

replaceAllパターンと置換の両方に正規表現を使用します。どちらもバックスラッシュをエスケープする必要があります。したがって、2 番目の引数に必要な正規表現置換パターンは次のとおりです。

\\"

\とJava"文字列リテラルもエスケープする必要があるため、これらの各文字には追加のバックスラッシュが必要です。引用符を追加すると、次のようになります。

"\\\\\""

これは、ソースにあるものです。

正規表現を使わString.replaceに which を使えば簡単です。そうすれば、この文字列 (文字列リテラルではなく) を 2 番目の引数として提供しようとしているだけです。

\"

エスケープして文字列リテラルに変換すると、次のようになります。

"\\\""

これはまだ素晴らしいとは言えませんが、少なくとも改善されています。

別の方法は、次のように使用することreplaceAllですMatcher.quoteReplacement

t = t.replaceAll("\"", Matcher.quoteReplacement("\\\""));

個人的には、私はただ使用したいと思いreplace()ます。結局のところ、正規表現の置換は必要ありません。

于 2013-01-17T21:11:55.423 に答える