2013-03-29 40 views
6

我試圖做類似如下:Scala的匹配情況直接

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

的想法是使用它像常規開關的情況下正則表達式匹配。但我似乎無法開始編譯。什麼是正確的方式來做它在斯卡拉?

回答

16

您可以匹配預編譯的正則表達式(如下面的第一種情況),或者添加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

我希望scala添加更多的句法糖來處理這個問題,我不喜歡額外的代碼來匹配更簡單的正則表達式。花了相當一段時間找出如何做到這一點之後,我無法相信它在Scala中不可行,因此StackOverflow的發佈! – Sajid

+1

使用'val testRegex =「」「TEST:(。*)」「」。r'和'case testRegex(m)=> println(「TEST」+ m)'捕獲匹配 – Renaud