直接在正则表达式上的Scala匹配案例

时间:2013-03-29 02:51:29

标签: scala

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

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

这个想法是使用它像groovy switch case正则表达式匹配。但我似乎无法编译。什么是scala中正确的方法?

2 个答案:

答案 0 :(得分:20)

您可以匹配预编译的正则表达式(如下面的第一种情况),也可以添加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")
     }
   }

查看更多信息here和一些背景here

答案 1 :(得分:1)

Scala 2.13开始,可以通过unapplying a string interpolator直接对String进行模式匹配:

// 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")