さらに2つ\\
が仕事をします:
scala> line.replaceAll("\"" , "\\\\\"");
res5: java.lang.String = replace \" quote
ここでの問題は、文字列をエスケープする 2 つの「レイヤー」があることです。最初のレイヤーはコンパイラーで、REPL で簡単に確認できます。
scala> "\""
res0: java.lang.String = "
scala> "\\"
res1: java.lang.String = \
scala> "\\\""
res2: java.lang.String = \"
scala> val line:String = "replace \" quote";
line: String = replace " quote
2 番目のレイヤーは、正規表現インタープリターです。これは見にくいですが、あなたの例に適用することで見ることができます:
scala> line.replaceAll("\"" , "\\\"");
res5: java.lang.String = replace " quote
何の規制。指数 インタプリタが実際に受け取るのは \" であり、これは " のみと解釈されます。したがって、regが必要です。指数 \\" を受け取ります。コンパイラに \ を与えるには、\\ と書く必要があります。
アンエスケープを見てみましょう:
- 正しいケース: \\\" コンパイラは \" を認識し、正規表現は \" を認識します。
- 間違ったケース: \\" コンパイラは \" を認識し、正規表現は ".
非常に単純ですが、少し混乱する可能性があります。
@sschaef が指摘したように、""" トリプル クォーテーションを使用する別の方法として、この形式の文字列はコンパイラによってエスケープ解除されません。
scala> line.replaceAll("\"" , """\\"""");
res6: java.lang.String = replace \" quote