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

Saj*_*jid 8 scala

我想尝试做以下事情:

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

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

Ale*_*ula 21

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

点击此处查看更多信息和背景信息.

  • 使用 `val testRegex = """TEST: (.*)""".r` 和 `case testRegex(m) => println("TEST "+m)` 来捕获匹配 (3认同)
  • 我希望scala添加更多语法糖来处理此问题,我不喜欢用于匹配更简单正则表达式的额外代码。在花了很多时间找出解决方法之后,我不敢相信它在Scala中不可行,因此在StackOverflow上发布了! (2认同)

Xav*_*hot 10

开始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")
Run Code Online (Sandbox Code Playgroud)