2010-06-12 16 views
16

En scala.util.matching.Regex trait MatchData veo que hay soporte para nombres de grupo, pensé que esto estaba relacionado con (Regex Named Capturing Groups)Scala expresiones regulares nombrado grupos de captura

Pero desde Java does not support groupnames until version 7 como yo lo entiendo (ref), versión 2.8.0 Scala (. Java HotSpot (TM) de 64 bits del servidor VM, Java 1.6 me da esta excepción:?

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) 

así que la pregunta es nombrado grupos de captura apoyado en Scala Si lo que cualquier ejemplos por ahí

? 0

Respuesta

21

Me temo que los grupos con nombre de Scala no están definidos de la misma manera. No es más que un alias de procesamiento posterior para grupos sin nombre (es decir, solo numerados) en el patrón original.

He aquí un ejemplo:

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

Esta impresora (as seen on ideone.com):

Bond, James 

Lo que sucede es que en el constructor de la Regex, proporcionamos los alias para el grupo 1, 2, etc. Luego podemos referirnos a estos grupos por esos nombres. Estos nombres no son intrínsecos en los patrones mismos.

+2

Gracias. No hay RichString.r sobrecargado para eso. – oluies

+0

¿Sigue siendo este el comportamiento en scala 2.11 con Java7? – javadba

+2

@javadba Todavía lo es. Ahora también puede hacer 'val pattern =" "" (\ w *) (\ w *) "" ". R (" firstName "," lastName ");' – Majki

2

Scala no tiene su propia imlementación de la coincidencia de expresiones regulares. En cambio, las expresiones regulares subyacentes son Java, por lo que los detalles de los patrones de escritura son los documentados en java.util.regex.Pattern.

No se dará cuenta que la sintaxis que utiliza es en realidad la de la restricción de observación detrás, aunque de acuerdo a los documentos del < debe ir seguido de un = (look-detrás positivo) o ! (Look-negativo detrás).

+2

Esto es algo que debería haberse marcado como un error hace mucho tiempo. Aunque arroja una excepción cuando se supone que debe hacerlo, el mensaje debería ser "Grupo de mirada oculta detrás" (como obviamente fue intencionado) o incluso mejor "Tipo de grupo desconocido". Está, por supuesto, fijado en JDK 1.7 como un efecto secundario de agregar grupos con nombre. –

+0

Esto ya no es cierto a partir de JDK7, en el que los nombres de grupos son compatibles con JDK pero no con scala. – javadba

Cuestiones relacionadas