2016-03-31 21 views
4

Ich bin ein bisschen verwirrt mit _ * Verwendung im folgenden Beispiel.Es verhält sich anders und ich bin völlig verloren in der herauszufinden._ * Verwendung ist Scala Mustervergleich

val p1="scala".r 
val p2="([0-9]+[.]?[0-9]*|[.][0-9]+)$".r 

"scala" match {case p1(_) => true case _ => false } // return false 


"scala" match {case p1(_ *) => true case _ => false } // return true 

"9" match {case p2(_) => true case _ => false} // return true 

Vielen Dank im Voraus.

+0

'match' benötigt eine Fanggruppe im Muster. Mit '_ *' ignorieren Sie diese Anforderung. –

Antwort

3

Die match benötigt mindestens eine Erfassungsgruppe im Muster, weil Sie case(_) verwenden. Dies liegt daran, dass "Match-Case" unapplySeq(target: Any): Option[List[String]] verwendet, die die Capture-Gruppenwerte zurückgibt, und Sie benötigen 1 erfassten Wert, um mit _ vorhanden zu sein. Mit _ * ignorieren Sie diese Anforderung. Siehe Scala regex reference:

nur Um zu überprüfen, ob die Regex übereinstimmt, alle Gruppen zu ignorieren, verwenden Sie eine Sequenz Wildcard:

"2004-01-20" match { case date(_*) => "It's a date!" }

Ihre p2 eine Erfassungsgruppe enthält, damit die letzte Zeile gibt true zurück.

Ihre p1 enthält keine Erfassungsgruppe, daher schlägt die erste match fehl. Die zweite Möglichkeit besteht nicht seit Sie diese Anforderung mit * deaktiviert haben.

Als Alternative können Sie case p1() mit Ihrem ersten Zeile verwenden (die _ die obligatorische erste Capture-Gruppe darstellt, wird hier entfernt), und es wird auch funktionieren:

"scala" match {case p1() => true case _ => false }) // return true 

Sehen Sie diese IDEONE demo

+0

Ich habe die Antwort mit mehr Erklärungen und einer Beispieldemo aktualisiert. –

+0

Incr 1 für IDEONE - noch nie zuvor davon gehört. –

+1

@ WiktorStribiżew Vielen Dank – John