2016-08-03 125 views
1

我想寫一些乾淨的pattern-matching代碼。列表中值的匹配

我有一個ListRegex的:

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