【问题标题】:Scala: Splitting with Double Quotes ("") vs Single Quotes ('')Scala:用双引号(“”)与单引号('')分割
【发布时间】:2017-12-18 11:40:51
【问题描述】:

我在 Scala 中使用双引号将字符串拆分为逗号,如下所示:

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

scala> a.split(",")
res0: Array[String] = Array(a, b, c)

它工作正常。此外,使用单引号时效果很好:

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

但是,当我使用双引号将字符串与管道分开时,它没有给出正确的结果:

scala> val a = "a|b|c"
a: String = a|b|c

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

然而,使用单引号给出正确的结果:

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

谁能帮助我理解这种行为?

【问题讨论】:

    标签: scala


    【解决方案1】:

    首先'|'Char"|"String

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

    现在,当您将String 传递给String.split 时,它会使用它来创建一个正则表达式,然后用它来拆分String

    |是正则表达式中的特殊字符。

    这意味着您需要escape 您的| 以便它不会被视为特殊字符。在正则表达式中,我们使用\ 将下一个字符标记为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)
    

    或者,

    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)
    

    注意\\|\| 在不使用raw 时的区别,这是因为\ 是Scala 中的特殊字符Strings

    所以当我们不使用rawString时,我们必须首先告诉下一个\不是特殊字符,不会被String处理,因此保持原样。所以处理后的String 看起来像\|

    【讨论】:

      【解决方案2】:

      split 方法被重载。如果您使用单引号',您将被一个字符分割:

      def split(separator: Char)
      

      如果您使用双引号 ",则您使用的是采用正则表达式的 java split:

      public String[] split(String regex)
      

      由于管道| 是正则表达式中的保留字符,如果您使用双引号,则需要对其进行转义:

      a.split("\\|")
      

      【讨论】:

        【解决方案3】:

        管道 (|) 是正则表达式中的元字符。你需要逃避它:

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

        【讨论】:

          【解决方案4】:

          按字符分割或按字符串转义。

          将其用作字符

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

          它有效,您需要使用转义序列。管道 (|) 具有特殊含义。你需要使用转义序列来表示它是一个普通的字符。

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

          三引号

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-17
            • 2012-12-13
            • 2012-12-30
            • 1970-01-01
            • 1970-01-01
            • 2013-02-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多