我在scala REPL中尝试以下代码:
"ASD-ASD.KZ".split('.')
res7: Array[String] = Array(ASD-ASD, KZ)
"ASD-ASD.KZ".split(".")
res8: Array[String] = Array()
为什么这个函数调用有不同的结果?
答案 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)
其中:
\
转义以下字符\
转义为正则表达式的点的字符,我们希望将其用作字符.
- 用于分割字符串的字符