我使用双引号将Scala中的String与Comma分开,如下所示:
scala> val a = "a,b,c"
a: String = a,b,c
scala> a.split(",")
res0: Array[String] = Array(a, b, c)
工作正常。此外,它在使用单引号时工作正常:
scala> a.split(',')
res1: Array[String] = Array(a, b, c)
但是,当我使用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)
然而,使用单引号可以得到正确的结果:
scala> a.split('|')
res2: Array[String] = Array(a, b, c)
任何人都可以帮助我理解这种行为吗?
答案 0 :(得分:5)
首先'|'
为Char
而"|"
为String
。
scala> val a1 = '|'
// a1: Char = |
scala> val a2 = "|"
// a2: String = |
现在,当您将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)
。
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)
或者,
\\|
请注意,\|
和raw
在使用\
时存在差异,因为Strings
是Scala raw
中的特殊字符。
因此,当我们不使用String
\
时,我们必须首先告诉下一个String
不是特殊字符,并且不会被String
处理,因此保持原样。因此处理后的\|
看起来像$ProcessOutgoingSMS = new ProcessOutgoingSMS(2);
。
答案 1 :(得分:1)
将其用作char
scala> a.split('|')
res5: Array[String] = Array(a, b, c)
它有效,你需要使用转义序列。管道(|)具有特殊含义。您需要使用转义序列来表示它是正常的字符。
scala> val a = "a|b|c"
a: String = a|b|c
scala> a.split("\\|")
res2: Array[String] = Array(a, b, c)
带三引号
scala> a.split("""\|""")
res4: Array[String] = Array(a, b, c)
答案 2 :(得分:1)
管道(|)是正则表达式中的元字符。你需要逃脱它:
scala> a.split("\\|")
res1: Array[String] = Array(a, b, c)
答案 3 :(得分:1)
拆分方法已重载。如果您使用单引号'
,则按字符分割:
def split(separator: Char)
如果您使用双引号"
,则使用带有正则表达式的java split:
public String[] split(String regex)
由于管道|
是正则表达式中的保留字符,因此如果使用双引号,则需要将其转义:
a.split("\\|")