2013-03-29 12 views
6

Я пытаюсь сделать что-то вроде следующего:Scala матч случай на регулярное выражение непосредственно

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

Идея заключается в том, чтобы использовать его как заводной переключатель случае матч регулярного выражения. Но я, похоже, не собираюсь компилироваться. Каков правильный способ сделать это в scala?

ответ

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