【问题标题】:Scala. Split line regex returns unexpected empty String斯卡拉。拆分行正则表达式返回意外的空字符串
【发布时间】:2017-05-09 21:47:58
【问题描述】:

请看下面的例子。我创建了一个多行字符串,然后尝试拆分它。除了第一行外,它工作正常。默认情况下 split 方法不返回分隔符。所以,我想知道它返回"" 的行的开头有什么特别之处。以及如何更新正则表达式以避免它。

scala> val Shakespear =
     |     """
     |       |To be,
     |       | or not
     |       |to be:
     |     """.stripMargin
Shakespear: String =
"
To be,
 or not
to be:
    "

scala> Shakespear.split("""[\s]+""")
res3: Array[String] = Array("", To, be,, or, not, to, be:)

谢谢。

【问题讨论】:

    标签: regex scala


    【解决方案1】:

    不更新regex,不如trim两端的空格,然后拆分:

    Shakespear.trim.split("\\s+")
    // res22: Array[String] = Array(To, be,, or, not, to, be:)
    

    至于为什么你有一个空字符串,你在字符串的开头有一个换行符,它也被\\s捕获,并且拆分它会给你一个空字符串,因为前面没有任何内容分隔符。

    这是你的字符串的原始表示(转义自here):

    def escape(raw: String): String = {
        import scala.reflect.runtime.universe._
        Literal(Constant(raw)).toString
    }
    
    escape(Shakespear)
    // res24: String = "\nTo be,\n or not\nto be:\n          "
    

    如果您不想在换行符处拆分,请改用“”:

    Shakespear.split(" ")
    
    //res26: Array[String] =
    //Array("
    //To", "be,
    //", or, not
    //to, "be:
    //")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多