9

「\」に置き換えるにはどうすればよいですか。

これが私がしようとしているものです:

def main(args:Array[String]) = {      
  val line:String = "replace \" quote";
  println(line);
  val updatedLine = line.replaceAll("\"" , "\\\"");
  println(updatedLine);
}

出力:

replace " quote
replace " quote

出力は次のようになります。

replace " quote
replace \" quote
4

3 に答える 3

14

StringOpsクラスの「replaceAllLiterally」メソッドを使用します。これは、引数のすべてのリテラルオカレンスを置き換えます。

scala> val line:String = "replace \" quote"
line: String = replace " quote

scala> line.replaceAllLiterally("\"", "\\\"")
res8: String = replace \" quote
于 2012-08-26T02:09:43.733 に答える
9

さらに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
于 2012-08-24T19:06:34.423 に答える