【问题标题】:matching a string with regex scala将字符串与正则表达式 scala 匹配
【发布时间】:2019-05-01 09:06:23
【问题描述】:

我写了以下函数:

import scala.util.matching.Regex
val COL1 = "COL1"
val COL2 = "COL2"
val COL3 = "COL3"
val COL4 = "COL4"
val COL5 = "COL5"
val reg = ".+-([\w\d]{3})-([\d\w]{3})-([\d\w]{3})-([\w]+)$-([\w]+)".r.unanchored
val dataExtraction: String => Map[String, String] = {
  string: String => {
    string match {
      case reg(col1, col2, col3, col4, col5) =>
                 Map(COL1 -> col1, COL2 -> col2, COL3 -> col3, COL4 -> col4 ,COL5 -> col5 )
      case _  => Map(COL1 -> "", COL2 -> "", COL3 -> "", COL4 -> "" ,COL5 -> "" )
    }
  }
}

它应该解析像“dep-gll-cde3-l4-result”或“cde3-gll-dep-l4-result”这样的字符串

知道如何定义一个解析这两个的正则表达式

【问题讨论】:

  • 没有必要发布重复的问题。以下方法有什么问题?
  • Scalacode,你的意思是你想要"""(?:.*/)?(\w{3,4})-(\w{3})-(\w{3,4})-(\w+)-(\w+)""".r"""(?:.*/)?(\w{3,4})-(\w{3})-(\w{3,4})-(\w+)-(\w+)\.orc""".r 之类的东西吗?实际输入和预期输出是多少?
  • 不要发布重复的问题。

标签: regex scala


【解决方案1】:

您可以使用以下正则表达式:

val reg = """(\w{3,4})-(\w{3})-(\w{3,4})-(\w+)-(\w+)""".r

您无需取消锚定,因为该模式与您的整个输入相匹配。

请注意,在三引号字符串文字中,您可以使用单个 \ 定义反斜杠,在您的情况下,它们需要加倍。另外,请参阅{3,4} 量词,对于您提供的案例来说似乎足够了。

请参阅online Scala demoregex demo

【讨论】:

  • 这不保持相同的顺序,我得到: dataExtraction("dfp-vll-cvi3-l2-result") 我得到 Map[String,String] = Map(COL4 -> l2, COL2 -> vll,COL3 -> cvi3,COL1 -> dfp,COL5 -> 结果)。请问有没有办法保持相同的顺序
  • @scalacode Map 不保留项目的顺序,如果您需要保留订单use LinkedHashMap
猜你喜欢
  • 2013-08-30
  • 2013-10-18
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多