Domanda

scala.util.matching .Regex tratto MatchData vedo che c'è il supporto per nomi di gruppo, ho pensato che questo era legato a ( Regex nome gruppi di cattura )

Java non supporta nomi di gruppo fino alla versione 7 se ho capito bene ( ref ), Scala versione 2.8.0 (Java HotSpot (TM) 64 . bit Server VM, Java 1.6 mi dà questa eccezione:

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)

Quindi la domanda è chiamato gruppi di cattura supportate a Scala? Se è così tutti gli esempi là fuori?

È stato utile?

Soluzione

Ho paura che i gruppi con nome di Scala non sono definiti nello stesso modo. Non è altro che un alias di post-elaborazione per i gruppi senza nome (cioè solo numerate) nel modello originale.

Ecco un esempio:

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

Questo stampa ( come visto in ideone.com ):

Bond, James

Che cosa succede qui è che nel costruttore per il Regex, forniamo gli alias per il gruppo 1, 2, ecc Poi si può fare riferimento a questi gruppi da quei nomi. Questi nomi non sono intrinseche nei modelli stessi.

Altri suggerimenti

Scala non ha una propria imlementation di corrispondenza di espressioni regolari. Invece i sottostanti le espressioni regolari sono Java, quindi i dettagli di scrittura modelli sono quelli documentati nel java.util.regex.Pattern.

Vi si possono trovare che la sintassi si sta utilizzando è in realtà quella del look-dietro costrizione, se secondo la documentazione del < deve essere seguito da uno = (positivo look-dietro) o ! (negativo look-dietro ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top