2016-10-06 9 views
0

Ich habe eine Scala regex die wie folgt aussieht:Extrahieren von passenden Gruppen mit Scala regex

"fizz<[a-zA-Z0-9]+,[a-zA-Z0-9]+>" 

I ein Verfahren haben, die diese regex verwendet und vergleicht sie mit einem String-Argument. Wenn das Argument mit der Regex übereinstimmt, möchte ich die erste passende Gruppe (also den Wert innerhalb der ersten [a-zA-Z0-9]+) sowie die zweite passende Gruppe erhalten. Wenn ich also in "fizz<herp,derp>" als mein Argument übergeben, würde ich „Herp“ und „derp“ in der Lage sein wollen, zu erhalten:

Irgendwelche Ideen,
def computeKey(buzz : String) : String = { 
    var key : String = "blah" 
    val regex = "fizz<[a-zA-Z0-9]+,[a-zA-Z0-9]+>".r 
    if(buzz matches regex) {    // TODO: How do I do this check? 
     val firstElement : String = "" // TODO: Get this (ex: "herp") 
     val secondElement : String = "" // TODO: Get this (ex: "derp") 

     // Ex: "herp-derp" 
     key = s"${firstElement}-${secondElement}" 
    } 
} 

, wie ich dies erreichen kann?

Antwort

1

Sie können es Definieren von Gruppen in Ihrem regulären Ausdruck:

val regex = "fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r 

und dann Werte der Gruppen auf diese Weise zu extrahieren: Sie parenthesis

buzz match { 
    case regex(first, second) => s"$first, $second" 
    case _ => "blah" 
} 
0

Wie @Nyavro erwähnt müssen die passenden Teile extrahieren

Abgesehen von der Mustererkennung können Sie dies auch tun.

val regex = "fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r 

val regex(a, b) = "fizz<foo,bar>" 

Scala REPL

scala> val regex = "fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r 
regex: scala.util.matching.Regex = fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)> 


scala> val regex(a, b) = "fizz<foo,bar>" 
a: String = foo 
b: String = bar 

Diese Syntax ist recht praktisch, aber über den Fall vorsichtig sein, wenn eine Anpassung nicht geschieht. Wenn kein Abgleich stattfindet, wird eine Ausnahme ausgelöst. Behandeln Sie die Ausnahme im Code ordnungsgemäß.

+0

Dies fügt nichts zur angenommenen Antwort außer etwas allgemeinerer Syntax hinzu, die das OP nicht verlangte, und die fast sicher eine schlechte Idee für etwas wie Regexabgleich ist. –