2010-06-12 23 views
16

In scala.util.matching.Regex trait MatchData ich sehe, dass es für die Gruppennamen unterstützen, dachte ich, dass dies wurde im Zusammenhang (Regex Named Capturing Groups)Scala regex Named Capturing Gruppen

Aber da Java does not support groupnames until version 7 wie ich es verstehe (ref), Scala Version 2.8.0 (. Java HotSpot (TM) 64-Bit Server VM, Java 1.6 gibt mir diese Ausnahme:

scala> val pattern = """(?<login>\w+) (?<id>\d+)""".r 
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio 
us maximum length near index 11 
(?<login>\w+) (?<id>\d+) 
     ^
     at java.util.regex.Pattern.error(Pattern.java:1713) 
     at java.util.regex.Pattern.group0(Pattern.java:2488) 
     at java.util.regex.Pattern.sequence(Pattern.java:1806) 
     at java.util.regex.Pattern.expr(Pattern.java:1752) 
     at java.util.regex.Pattern.compile(Pattern.java:1460) 

die Frage ist also Named Capturing in Scala unterstützt Gruppen Wenn ja da draußen irgendwelche Beispiele

? 0

Antwort

21

Ich fürchte, dass die genannten Gruppen von Scala nicht auf die gleiche Weise definiert sind. Es ist nichts anderes als ein Nachbearbeitungsalias für unbenannte (d. H. Gerade nummerierte) Gruppen im ursprünglichen Muster.

Hier ist ein Beispiel:

import scala.util.matching.Regex 

object Main { 
    def main(args: Array[String]) { 
     val pattern = new Regex("""(\w*) (\w*)""", "firstName", "lastName"); 
     val result = pattern.findFirstMatchIn("James Bond").get; 
     println(result.group("lastName") + ", " + result.group("firstName")); 
    } 
} 

Diese Drucke (as seen on ideone.com):

Bond, James 

Was das für die Regex im Konstruktor ist hier passiert, wir die Aliase für die Gruppe 1, bieten 2, usw. Dann können wir auf diese Gruppen mit diesen Namen verweisen. Diese Namen sind nicht in den Mustern selbst enthalten.

+2

Danke. Es gibt keinen überladenen RichString.r dafür. – oluies

+0

Ist das noch das Verhalten in Scala 2.11 mit Java7? – javadba

+2

@javadba Es ist immer noch. Jetzt kannst du auch 'val pattern =" "" (\ w *) (\ w *) "" ". R (" firstName "," lastName ");' – Majki

2

Scala hat keine eigene Implementation des regulären Ausdrucks. Stattdessen sind die zugrunde liegenden regulären Ausdrücke Java-Zeichen, also sind die Details der Schreibmuster diejenigen, die in java.util.regex.Pattern dokumentiert sind.

Dort werden Sie feststellen, dass die Syntax, die Sie verwenden ist eigentlich, dass die Blick hinter Einschränkung, obwohl die Dokumentation nach den < muss entweder durch = (positiven Blick hinter) oder ! (negativen Look- folgen hinter).

+2

Dies ist etwas, das vor langer Zeit als Fehler markiert sein sollte. Obwohl es eine Ausnahme auslöst, sollte die Nachricht "Unbekannte Look-Behind-Gruppe" sein (wie es offensichtlich beabsichtigt war) oder besser "Unbekannter Gruppentyp". Es ist natürlich in JDK 1.7 als Nebeneffekt des Hinzufügens von benannten Gruppen behoben. –

+0

Dies gilt ab JDK7 nicht mehr - wobei Gruppennamen im JDK, aber nicht in scala unterstützt werden. – javadba

Verwandte Themen