如何在Scala

时间:2016-02-21 00:58:03

标签: scala pattern-matching

我在Scala中有一个String列表,每个String都有一个键/值格式,如下所示:

<row Id="25780063" PostTypeId="2" ParentId="25774527" CreationDate="2014-09-11T05:56:29.900" />

每个String可能有一些额外的键/值。我想为每个字符串提取几个键的值。这是我定义的模式,但它无法正常工作

val idPattern = "Id=(.*).r
val typePattern = "PostTypeId=(.*)".r

如何正确提取&#39; Id&#39;的值?和&#39; PostTypeId&#39;?

2 个答案:

答案 0 :(得分:1)

让它无法取消说找到而不是匹配所有输入。

scala> val id = """Id="([^"]*)"""".r.unanchored
id: scala.util.matching.UnanchoredRegex = Id="([^"]*)"

scala> """stuff Id="something" more""" match { case id(x) => x }
res7: String = something

scala> id.findFirstIn("""stuff Id="something" more""")
res8: Option[String] = Some(Id="something")

答案 1 :(得分:0)

首先,您必须将正则表达式定义为有效的稳定标识符。

val IdPattern = "Id=(.*).r
val TypePattern = "PostTypeId=(.*)".r
  

注意模式匹配所需的初始大写(或者如果真的希望它是小写的,则使用反引号)。

然后,

aString match {
  case IdPattern(group) => println(s"id=$group")
  case TypePattern(group) => println(s"type=$group")
}