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

Slo*_*rry 6 split scala

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

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

"ASD-ASD.KZ".split(".")
res8: Array[String] = Array()
Run Code Online (Sandbox Code Playgroud)

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

Avi*_*mka 8

功能使用有很大的不同.

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)
  }
Run Code Online (Sandbox Code Playgroud)

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

scala> "ASD-ASD.KZ".split('.')
res0: Array[String] = Array(ASD-ASD, KZ)
Run Code Online (Sandbox Code Playgroud)

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

scala> "ASD-ASD.KZ".split("\\.")
res2: Array[String] = Array(ASD-ASD, KZ)
Run Code Online (Sandbox Code Playgroud)

哪里:

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