2013-03-29 12 views
6

sto cercando di fare qualcosa di simile al seguente:Scala partita caso su regex direttamente

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

L'idea è quella di utilizzarlo come Groovy partita regex caso interruttore. Ma non riesco a arrivare a compilare. Qual'è il modo giusto per farlo in scala?

risposta

16

È possibile associare un'espressione regolare precompilata (come nel primo caso di seguito) o aggiungere una clausola if. Si noti che in genere non si desidera ricompilare la stessa espressione regolare in ciascuna valutazione case, ma piuttosto averla su un oggetto.

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

Tutte le informazioni here e alcuni retroscena here.

+1

Vorrei che la scala aggiungesse più zucchero sintattico per la gestione di questo, non mi piacciono i codici extra per la corrispondenza con espressioni regolari più semplici. Dopo aver passato un po 'di tempo a scoprire come farlo, non potevo credere che non fosse fattibile in Scala, quindi il post di StackOverflow! – Sajid

+1

usa 'val testRegex =" "" TEST: (. *) "" ". R' e' case testRegex (m) => println ("TEST" + m) 'per catturare la corrispondenza – Renaud