9

我正在尝试执行以下操作:

list.foreach {x => 
     x match {
       case """TEST: .*""" => println( "TEST" )
       case """OXF.*"""   => println("XXX")
       case _             => println("NO MATCHING")
     }
}

这个想法是像 groovy switch case regex match 一样使用它。但我似乎无法编译。在scala中做这件事的正确方法是什么?

4

2 回答 2

24

您可以匹配预编译的正则表达式(如下面的第一种情况),或者添加一个if 子句。请注意,您通常不想在每次case评估时重新编译相同的正则表达式,而是将其放在对象上。

val list = List("Not a match", "TEST: yes", "OXFORD")
   val testRegex = """TEST: .*""".r
   list.foreach { x =>
     x match {
       case testRegex() => println( "TEST" )
       case s if s.matches("""OXF.*""") => println("XXX")
       case _ => println("NO MATCHING")
     }
   }

在这里查看更多信息和一些背景信息

于 2013-03-29T03:17:41.363 回答
11

开始Scala 2.13,可以String通过取消应用字符串插值器直接模式匹配 a :

// val examples = List("Not a match", "TEST: yes", "OXFORD")
examples.map {
  case s"TEST: $x" => x
  case s"OXF$x"    => x
  case _           => ""
}
// List[String] = List("", "yes", "ORD")
于 2019-06-26T21:10:01.627 回答