我使用双引号将逗号中的字符串拆分为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)
任何人都可以帮助我理解这种行为吗?
首先,'|'为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样子会是这样的\|.