2

私は文字列を持っておりvar str = "hello, world"ListパターンRegex

val patterns = List(new Regex("hello, (.*)", "substr"), new Regex("hi, (.*)", "substr"))

strこれらのパターンに対してどのように一致させることができますか? Listパターンを使用する代わりに、次のことを行っています。

val pattern1 = new Regex("hello, (.*)", "substr")
val pattern2 = new Regex("hi, (.*)", "substr")
var someVar = "something"
var someVar2 = "something else"
str match {
    case pattern1(substr) => { someVar = substr; someVar2 = "someValue" }
    case pattern2(substr) => { someVar = substr; someVar2 = "someOtherValue" }

}

付録:

重要なことを 1 つ言い忘れていました。実際には、パターンのリストがいくつかあります。someVar2 は、最初のパターン一致が発生したリストに応じて値を取得します。のようなネストされたリストを使用するか、のようなパターンのリストごとにList(List(new Regex(...), new Regex(...), ...), List(new Regex(...), new Regex(...), ...))個別に使用するかは、私にとっては問題ではありません。valval patterns1 = List(new Regex(...), ...); val patterns2 = List(new Regex(...), ...)

4

2 に答える 2

7

これを試して:

scala> patterns.collectFirst{ p => str match { case p(substr) => substr } }
res3: Option[String] = Some(world)

scala> val str2 = "hi, Fred"
str2: String = hi, Fred

scala> patterns.collectFirst{ p => str2 match { case p(substr) => substr } }
res4: Option[String] = Some(Fred)

編集:変更された要件を考慮して更新しています...

与えられた:

val patternMapping = Map(("marker1" -> patterns), ("marker2" -> patterns2), ...)

次のような結果になるように、collectFirst 呼び出しをネストできるはずです。

scala> patternMapping.collectFirst{ case (mark, pList) => pList.collectFirst{ p => str match { case p(substr) => (mark -> substr) } } }.flatten
res5: Option[(String, String)] = Some((marker1,world))

これはおそらくいじって整理することができると思いますが、一般的なアイデアを提供する必要があります.

于 2013-08-27T14:16:11.133 に答える