2016-08-03 2 views
1

クリーンpattern-matchingコードを書きたいと思います。Listの値の一致

私はRegexListを持っている:

val myList = List(
    ".+\\.a".r, 
    ".+\\.b".r, 
    ".+\\.c".r.+ 
) 

私は次のように近づいて何かをしたいと思います:

myInputString match { 
    case matchAnyRegexFromMyList(s) => //do something 
} 

する代わりに:

myInputString match { 
    case regex1(a)|regex2(b)... => //do something 
} 

はそれがにありますもっと簡潔にすることは可能ですか?

答えて

3

あなたのパターンは、プリコンパイルされなかった場合は、それらがコンパイルされたとき、あなたがそれらを組み合わせることができます。

val myList = List(".+\\.a" 
       , ".+\\.b" 
       , ".+\\.c") 

val myListRE = myList.mkString("|").r 

"blah.b" match { 
    case myListRE() => println("hit") 
} 
3

実行時にcase節を生成することはできません。コンパイル時にマクロを作成して作成することができます。

あなたはしかし、カスタムエクストラクタを使用することができます。

case class MultiPattern(patterns: List[Regex]) { 
    def unapply(s: String): Option[String] = 
    patterns.flatMap(_.findFirstIn(s)).headOption 
} 

val myMultiPattern = MultiPattern(myList) 

val myInputString = "x.b" 
myInputString match { 
    case myMultiPattern(s) => println(s) // output: x.b 
} 
+0

また、これをパラメータ化し、定数を作成するために 'val'を使用することもできます。 –

+0

ヒントのおかげで;私は答えを更新しました。 – devkat

関連する問題