匹配List的值

时间:2016-08-03 07:08:18

标签: scala pattern-matching

我想写一些干净的pattern-matching代码。

我有List 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
}

至少可以更简洁吗?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:3)

如果你的模式没有预编译,你可以在编译时将它们组合起来。

onClick