2016-09-04 78 views
0

我正在分割一个基于管道的字符串| scala中的字符。我看到两个不同的选择来做到这一点。我很惊讶地看到我在不同的场景中得到了两个不同的结果。在scala中分割一个字符串与字符和字符串的区别

检查了这一点:

enter image description here

在字符串的情况下,它也返回管道字符,而在人物的情况下,它返回的结果如预期。

我很想知道这两者的区别。

回答

4

的事情是,当你提供String参数此String可以是一个正则表达式。而|是正则表达式世界中的一个特殊字符。

这将成为下面的例子后,更清楚你,

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

如果字符串需要转义,使用"\\|"代替"|"

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) 

请注意,变量les在raw字符串中插入,所以需要注意$

\Q当你有几个字符可以转义并且不想在每个字符之前加一个反斜杠时特别有用。