Scala:使用双引号("")与单引号('')

时间:2017-12-18 11:40:51

标签: scala

我使用双引号将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)

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

4 个答案:

答案 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("\\|")