我在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)
为什么这个函数调用有不同的结果?
功能使用有很大的不同.
该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)
哪里:
\ 逃避以下角色\转义为正则表达式的点的字符,我们希望将其用作字符. - 用于分割字符串的字符