Scala中的String.split函数

今天在写一个统计用户信息的程序时出现了bug,致使统计结果与真实值有很大差距。通过仔细检查,我发现是错误地使用split函数致使的。看来仍是对scala中的split函数的理解不够透彻。本篇博文将详细解释scala中String.split的参数及用法。正则表达式

由于scala中的String复用了Java的String,所以这也是Java中String.split的用法。数组

split函数主要有两种参数形式:函数

def split(arg0: String): Array[String]
def split(arg0: String, arg1: Int): Array[String]

咱们能够将第一种参数形式看做是默认arg1=0的第二种形式,即调用split(StrToSplit)等同于调用了split(StrToSplit, 0)。所以,我将主要介绍第二种参数形式。第二种参数形式中每一个参数的意义以下:es5

arg0: String 是一个正则表达式,表明分割的边界。这个正则表达式成功匹配一次,split的结果中就会加入一个新的子串。子串包含上次匹配后(若是没有上次匹配就是被分割字符串的起始位置)到此次匹配前的全部字符。最后,split函数会将最后一次匹配后剩余的字串做为最后一个子串加入到结果中。spa

arg1: Int 是对分割后子串的个数的限定。理解这个参数才能正确的运用split函数。scala

  当arg1大于0时,它限制arg0最多成功匹配arg1-1次,也就是说字符串最多被分红arg1个子串。此时split会保留分割出的空字符串(当两个arg0连续匹配活着arg0在头尾匹配,会产生空字符串),直到达到匹配上限。好比:
code

 1 scala> "a-b-c".split("-", 2)
 2 res38: Array[String] = Array(a, b-c)
 3 
 4 scala> "a-b-c".split("-", 4)
 5 res39: Array[String] = Array(a, b, c)
 6 
 7 scala> "-a-b-c--".split("-", 3)
 8 res40: Array[String] = Array("", a, b-c--)
 9 
10 scala> "-a-b-c--".split("-", 6)
11 res41: Array[String] = Array("", a, b, c, "", "")
12 
13 scala> "-a-b-c--".split("-", 5)
14 res42: Array[String] = Array("", a, b, c, -)
15 
16 scala> "-a-b-c--".split("-", 8)
17 res43: Array[String] = Array("", a, b, c, "", "")

  当arg1等于0时,split函数会尽量多的匹配arg0,但再也不保留处于末尾位置的空字符串(这里的一个特殊状况是,当被分割字符串是一个空字符串时,分割结果还是一个空字符串组成的数组)。好比:blog

 1 scala> "a-b-c".split("-", 0)
 2 res48: Array[String] = Array(a, b, c)
 3 
 4 scala> "a-b-c---".split("-", 0)
 5 res49: Array[String] = Array(a, b, c)
 6 
 7 scala> "-a--b--c---".split("-", 0)
 8 res50: Array[String] = Array("", a, "", b, "", c)
 9 
10 scala> "".split("-", 0)
11 res51: Array[String] = Array("")

  当arg1小于0时,split函数会尽量多的匹配arg0,而且保留末尾的空字符串。好比:字符串

1 scala> "a-b-c".split("-", -1)
2 res52: Array[String] = Array(a, b, c)
3 
4 scala> "-a--b--c-".split("-", -1)
5 res53: Array[String] = Array("", a, "", b, "", c, "")
相关文章
相关标签/搜索