2016-06-08 103 views
6

我嘗試在斯卡拉REPL下面的代碼:拆分功能差異

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

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

爲什麼這個函數調用有不同的結果?

回答

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) 

其中:

  • 首先\將下列字符轉義
  • \轉義字符點這是一個正則表達式,我們想用它作爲字符
  • . - 將字符串拆分的字符