Scala: Splitting with Double Quotes (“”) vs Single Quotes ('')

前端 未结 4 616
礼貌的吻别
礼貌的吻别 2020-12-20 03:01

I am splitting a String in Scala with Comma using Double Quotes, like this:

scala> val a = \"a,b,c\"
a: String = a,b,c

scala> a.split(\",\")
res0: Arr         


        
相关标签:
4条回答
  • 2020-12-20 03:28

    Split by char or escape if you string by string.

    Use it as char

    scala> a.split('|')
    res5: Array[String] = Array(a, b, c)
    

    It works, you need to use escape sequence. Pipe (|) has a special meaning. You need to use escape sequence to say its a normal char.

    scala> val a = "a|b|c"
    a: String = a|b|c
    
    scala> a.split("\\|")
    res2: Array[String] = Array(a, b, c)
    

    with triple quotes

    scala> a.split("""\|""")
    res4: Array[String] = Array(a, b, c)
    
    0 讨论(0)
  • 2020-12-20 03:30

    Pipe (|) is a metacharacter in regex. You'd need to escape it:

    scala> a.split("\\|")
    res1: Array[String] = Array(a, b, c)
    
    0 讨论(0)
  • 2020-12-20 03:36

    First of all '|' is Char whereas "|" is String.

    scala> val a1 = '|'
    // a1: Char = |
    
    scala> val a2 = "|"
    // a2: String = |
    

    Now, when you pass a String to String.split it uses it to create a a regular expression, which is then used to split the String.

    And | is a special character in regular expressions.

    Which means that you need to escape your | so that it will not be considered as a special character. In regular expressions, we use \ to mark the next character as escaped.

    scala> val a = "a|b|c"
    // a: String = a|b|c
    
    scala> a.split(raw"\|")
    // res2: Array[String] = Array(a, b, c)
    
    
    scala>a.split("\\|")
    // res0: Array[String] = Array(a, b, c)
    

    Or,

    scala> val a = "a|b|c"
    // a: String = a|b|c
    
    scala> val regex = raw"\|".r
    // regex: scala.util.matching.Regex = \|
    
    scala> regex.split(a)
    // res1: Array[String] = Array(a, b, c)
    

    Notice that \\| and \| difference when not using raw, that is because \ is a special character in Scala Strings.

    So when we are not using raw String we have to first tell that the next \ is not a special character and will not be processed by String, hence left as it is. So the processed String will look like \|.

    0 讨论(0)
  • 2020-12-20 03:39

    The split method is overloaded. If you use single quote ' you are splitting by a character:

    def split(separator: Char)
    

    If you use double quote " you are using java split that takes a regex:

    public String[] split(String regex)
    

    Since pipe | is a reserved character in a regex you need to escape it if you are using double quotes:

    a.split("\\|")
    
    0 讨论(0)
提交回复
热议问题