Scala:拆分双引号("")vs单引号('')

him*_*ian 2 scala

我使用双引号将逗号中的字符串拆分为Scala,如下所示:

scala> val a = "a,b,c"
a: String = a,b,c

scala> a.split(",")
res0: Array[String] = Array(a, b, c)
Run Code Online (Sandbox Code Playgroud)

它工作正常.此外,它使用单引号时工作正常:

scala> a.split(',')
res1: Array[String] = Array(a, b, c)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用Double Quotes拆分String with Pipe时,它没有给出正确的结果:

scala> val a = "a|b|c"
a: String = a|b|c

scala> a.split("|")
res3: Array[String] = Array(a, |, b, |, c)
Run Code Online (Sandbox Code Playgroud)

然而,使用单引号可以得到正确的结果:

scala> a.split('|')
res2: Array[String] = Array(a, b, c)
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我理解这种行为吗?

Sar*_*ngh 5

首先,'|'为Char而"|"为String.

scala> val a1 = '|'
// a1: Char = |

scala> val a2 = "|"
// a2: String = |
Run Code Online (Sandbox Code Playgroud)

现在,当你传递String给String.split它时,它使用它创建一个正则表达式,然后用它来分割String.

并且|是正则表达式中的特殊字符.

这意味着你需要escape你的|,这样就不会被视为一个特殊字符.在正则表达式中,我们使用\将下一个字符标记为escaped.

scala> val a = "a|b|c"
// a: String = a|b|c

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


scala>a.split("\\|")
// res0: Array[String] = Array(a, b, c)
Run Code Online (Sandbox Code Playgroud)

要么,

scala> val a = "a|b|c"
// a: String = a|b|c

scala> val regex = raw"\|".r
// regex: scala.util.matching.Regex = \|

scala> regex.split(a)
// res1: Array[String] = Array(a, b, c)
Run Code Online (Sandbox Code Playgroud)

请注意,\\|与\|不使用时的区别raw,那是因为\是Scala中的一个特殊字符Strings.

因此,当我们不使用时,raw String我们必须首先告诉下一个\不是特殊字符并且不会被处理String,因此保持原样.所以处理后的String样子会是这样的\|.