我想写一些干净的pattern-matching代码。
我有一个List of Regex
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
}至少有可能变得更简洁吗?
发布于 2016-08-03 07:48:24
如果您的模式不是预编译的,则可以在编译它们时组合它们。
val myList = List( ".+\\.a"
, ".+\\.b"
, ".+\\.c" )
val myListRE = myList.mkString("|").r
"blah.b" match {
case myListRE() => println("hit")
}发布于 2016-08-03 07:33:52
不可能在运行时生成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
}https://stackoverflow.com/questions/38736685
复制相似问题