Slow Harry
Slow Harry

Reputation: 1897

Split function difference between char and string arguments

I try the following code in scala REPL:

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

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

Why this function calls have a different results?

Upvotes: 6

Views: 385

Answers (1)

Avihoo Mamka
Avihoo Mamka

Reputation: 4786

There's a big difference in the function use.

The split function is overloaded, and this is the implementation from the source code of Scala:

/** For every line in this string:

  • Strip a leading prefix consisting of blanks or control characters
  • followed by | from the line.

*/

  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)
  }

So when you're calling split() with a char, you ask to split by that specific char:

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

And when you're calling split() with a string, it means that you want to have a regex. So for you to get the exact result using the double quotes, you need to do:

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

Where:

  • First \ escapes the following character
  • Second \ escapes character for the dot which is a regex expression, and we want to use it as a character
  • . - the character to split the string by

Upvotes: 7

Related Questions