2016-09-04 8 views
0

スカラのパイプ|に基づいて文字列を分割しています。私はこれを行うための2つの異なる選択肢を見る。さまざまなシナリオで2つの異なる結果が得られたことに驚いています。文字列と文字列をスカラで分割する場合の相違点

がこれをチェックアウト:予想通り、文字の場合には、それが結果を返されながら、文字列の場合は

enter image description here

を、それはまた、パイプ文字を返しました。

私はこれらの両方の違いを知りたいと思っています。

答えて

4

"\\|"を使用しています。 |は、正規表現の世界では特殊文字です。あなたが希望する結果を取得したい場合は

これは

scala> val s1 = "abcdef" 
s1: String = abcdef 

scala> s1.split("|") 
res7: Array[String] = Array(a, b, c, d, e, f) 

、例を以下の後にあなたに、より明確になるだろう、あなたはより多くの|使用\\

scala> val s1 = "abcdef" 
s1: String = abcdef 

scala> s1.split("\\|") 
res7: Array[String] = Array(abcdef) 
2

文字列の場合、エスケープする必要があります。あなたはこのStringが正規表現できStringパラメータを提供しているときのものがある代わりに"|"

scala> "a|b|c|d".split("|") 
res19: Array[String] = Array(a, |, b, |, c, |, d) 

scala> "a|b|c|d".split("\\|") 
res20: Array[String] = Array(a, b, c, d) 

scala> "a|b|c|d".split('|') 
res21: Array[String] = Array(a, b, c, d) 

scala> "a|b|c|d".split("""\|""") 
res23: Array[String] = Array(a, b, c, d) 
1

いくつかの方法をエスケープする必要があります正規表現をエスケープする:

scala> "a|b|c|d".split(raw"\|") 
res114: Array[String] = Array(a, b, c, d) 

scala> "a|b|c|d".split(raw"\Q|") 
res115: Array[String] = Array(a, b, c, d) 

scala> "a|b|c|d".split("""\Q|""") 
res116: Array[String] = Array(a, b, c, d) 

scala> "a|b|c|d".split("\\Q|") 
res117: Array[String] = Array(a, b, c, d) 

Variab lesはrawの文字列で補間されるので、$に注意する必要があります。

\Qは、エスケープする複数の文字があり、それぞれの前にバックスラッシュを挿入したくない場合に特に便利です。