将正则表达式匹配应用于案例类

时间:2013-02-06 06:16:21

标签: scala

给出正则表达式和字符串

val reg = "(a)(b)"
val str = "ab"

和相应的案例类

case class Foo(a: string, b: string)

如何将正则表达式与字符串匹配并取消应用匹配项 进入案例类,所以我有

Foo("a", "b")

到底?

2 个答案:

答案 0 :(得分:1)

模式匹配在字符串中查找正则表达式并将结果分配给Foo的结果。 Regex的API docs也有类似的例子。

scala> val reg = "(a)(b)".r
reg: scala.util.matching.Regex = (a)(b)

scala> val str = "ab"
str: String = ab

scala> case class Foo(a: String, b: String)
defined class Foo

scala> val foo = reg.findFirstIn(str) match{
     | case Some(reg(a,b)) => new Foo(a,b)
     | case None => Foo("","")
     | }
foo: Foo = Foo(a,b)

 scala> foo.a
res2: String = a

scala> foo.b
res3: String = b

答案 1 :(得分:0)

如果您确定匹配正常,则可以对该功能进行处理并使用foldleft将此版本应用于提取的参数列表:

> val reg = "(a)(b)".r
> val str = "ab"
> val f1 = (Foo.apply _).curried
// f1 : String => String => Foo
> val groups = reg.findFirstMatchIn(str).get.subgroups
// groups: List[String]
> val foo = ((f1 : Any) /: groups) { case (f: (String => Any), s) => f(s)} asInstanceOf[Foo]

foo: Foo = Foo(a,b)

请参阅scala中的Function2了解curried的定义。