6

与えられた正規表現と文字列

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

および対応するケース クラス

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

正規表現を文字列と照合し、一致をケースクラスに適用しないようにするにはどうすればよいですか

Foo("a", "b")

最終的には?

4

2 に答える 2

2

文字列内の正規表現を検索し、その結果を に割り当てた結果に対するパターン マッチFoo。Regexの APIドキュメントにも同様の例があります。

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
于 2013-02-06T06:28:42.770 に答える
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)

curried の定義については、Scala のFunction2を参照してください。

于 2013-10-03T10:02:50.903 に答える