2012-08-24 14 views
9

どのように "with \"を置き換えるのですか?ここで"と¥"を交換してください

はイムしようとするものである:

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 

答えて

9

つ以上\\は仕事をしていません:

scala> line.replaceAll("\"" , "\\\\\""); 
res5: java.lang.String = replace \" quote 

ここでの問題は、文字列をエスケープする2つの「レイヤー」があることです。

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 

第二の層は、正規表現のインタプリタである:第一層は、我々は簡単にREPLで見ることができるコンパイラ、です。これは見にくいですが、あなたの例を適用して見ることができます:

scala> line.replaceAll("\"" , "\\\""); 
res5: java.lang.String = replace " quote 

どのようなreg。 exp。通訳は実際には\ "を受け取りますが、これは単に"と解釈されます。だから、我々はregが必要です。 exp。 \\受け取るために「コンパイラが私たちを与えるようにするには、\我々は\\書く必要が

のは、アンエスケープ見てみましょう:。

  • 右のケースを:\\\」コンパイラが見ている\」、正規表現は\ "を見ます。
  • 間違っている場合:\\「コンパイラは\を見て」、正規表現は「見る

それは非常にまっすぐ進むことにもかかわらず、少し混乱することができ

@sschaefで指摘したように、。それは「」使用する」トリプル引用し、この形式の文字列は、コンパイラによってエスケープを解除されていません。

scala> line.replaceAll("\"" , """\\""""); 
res6: java.lang.String = replace \" quote 
+0

ヴァルupdatedLine = line.replaceAll( "\" " "\\\\\"")私のために働いた(私はいくつかの理由で5つの引用符を必要と)。 –

+0

書かれていました:) – pedrofurla

+1

混乱を避けるために、私は "" ... "の代わりに" "" "を使用することをお勧めします。 – sschaef

13

使用 『別の代替StringOpsクラスのreplaceAllLiterally』方法。これは、引数のすべてのリテラルの出現を置き換えます。

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

scala> line.replaceAllLiterally("\"", "\\\"") 
res8: String = replace \" quote 
+0

そして.replaceAllLiterallyと.replaceの違いは何ですか? – Rogach

+0

ニース、これについて知りませんでした! – pedrofurla

+0

恐ろしいです!ありがとう –

0

@pedrofurlaは、あなたが行った動作を見た理由をうまく説明します。あなたの問題のもう一つの解決策は、生の文字列をスカラーの三重引用符文字で使用することです。 1組の三重引用符の間のものは、Scalaコンパイラによる解釈のない生の文字列として扱われます。したがって:

stripMarginと組み合わせて使用​​
scala> line.replaceAll("\"", """\\"""") 
res1: String = replace \" quote 

、トリプル引用符があなたのコードの中に生の文字列を埋め込むための強力な方法です。たとえば:

val foo = """ 
     |hocus 
     |pocus""".stripMargin 

は、文字列が得られます。"\nhocus\npocus"

関連する問題