【发布时间】:2017-06-07 20:51:37
【问题描述】:
给定字符串格式的结构化数据,如何使用模式匹配和正则表达式有效地提取部分数据?
例子:
val input = Seq("name-12345","inval1d-12345","invalid-12here123","hello-54321","inval1d-1aa2")
case class Client(name:Option[String],clientID:Option[Int])
def parseClient(input:String):Option[Client] = {
val clientRegex = """([a-zA-Z]+)-([0-9]+)""".r
Option(input).flatMap(in => {
in match {
case clientRegex(name,clientID) => Some(Client(Some(name),Some(clientID.toInt)))
case _ => None
}
})
}
input.map(parseClient)
然而,这个问题是,如果我无法验证结构化数据的单个部分,那么我不会解析它。
我如何使用正则表达式在分层庄园中进行定义,例如:
val nameRegex = """([a-zA-Z]+)""".r
val clientIDRegex = """([0-9]+)""".r
然后将这些组合在一个模式中匹配?
示例的输出:
Seq(
Some(Client(Some("name"),Some(12345)))
,None
,None
,Some(Client(Some("hello"),Some(54321)))
,None
)
所需的输出:
Seq(
Some(Client(Some("name"),Some(12345)))
,Some(Client(None,Some(12345)))
,Some(Client(Some("invalid"),None))
,Some(Client(Some("hello"),Some(54321)))
,None
)
【问题讨论】:
-
您提供的输入的预期输出是什么?
-
@WiktorStribiżew 我已经编辑了这个问题,抱歉
标签: regex scala pattern-matching