char和字符串参数之间的分割函数差异

时间:2016-06-08 08:46:25

标签: scala split

我在scala REPL中尝试以下代码:

"ASD-ASD.KZ".split('.')
res7: Array[String] = Array(ASD-ASD, KZ)

"ASD-ASD.KZ".split(".")
res8: Array[String] = Array()

为什么这个函数调用有不同的结果?

1 个答案:

答案 0 :(得分:7)

功能使用方面存在很大差异。

split函数被重载,这是Scala源代码中的实现:

  

/ **对于此字符串中的每一行:

     
      
  • 删除由空格或控制字符组成的前导前缀
  •   
  • 后面跟|
  •   
     

* /

  def stripMargin: String = stripMargin('|')

  private def escape(ch: Char): String = "\\Q" + ch + "\\E"

  @throws(classOf[java.util.regex.PatternSyntaxException])
  def split(separator: Char): Array[String] = toString.split(escape(separator))

  @throws(classOf[java.util.regex.PatternSyntaxException])
  def split(separators: Array[Char]): Array[String] = {
    val re = separators.foldLeft("[")(_+escape(_)) + "]"
    toString.split(re)
  }

因此,当您使用char调用split()时,您要求按特定字符分割:

scala> "ASD-ASD.KZ".split('.')
res0: Array[String] = Array(ASD-ASD, KZ)

当你用字符串调用split()时,就意味着你想要一个正则表达式。因此,要使用双引号获得确切结果,您需要执行以下操作:

scala> "ASD-ASD.KZ".split("\\.")
res2: Array[String] = Array(ASD-ASD, KZ)

其中:

  • 首先\转义以下字符
  • 第二个\转义为正则表达式的点的字符,我们希望将其用作字符
  • . - 用于分割字符串的字符