tester - Scala regex grupos de captura con nombre
scala string regex (2)
Me temo que los grupos nombrados de Scala no se definen de la misma manera. No es más que un alias de post-procesamiento para grupos sin nombre (es decir, solo numerados) en el patrón original.
Aquí hay 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"));
}
}
Esto imprime ( como se ve en ideone.com ):
Bond, James
Lo que sucede aquí es que en el constructor de Regex
, proporcionamos los alias para los grupos 1, 2, etc. Luego podemos referirnos a estos grupos por esos nombres. Estos nombres no son intrínsecos en los patrones mismos.
En scala.util.matching.Regex rasgo MatchData veo que hay soporte para nombres de grupo, pensé que esto estaba relacionado con ( Regex Named Capturing Groups )
Pero como Java no admite nombres de grupo hasta la versión 7 como lo entiendo ( ref ), Scala versión 2.8.0 (Java HotSpot (TM) 64-Bit Server 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)
¿Entonces la pregunta es que los grupos de captura de nombres son compatibles con Scala? Si es así, ¿algún ejemplo por ahí?
Scala no tiene su propia imagen de coincidencia de expresiones regulares. En cambio, las expresiones regulares subyacentes son las de Java, por lo que los detalles de los patrones de escritura son los documentados en java.util.regex.Pattern.
Ahí encontrará que la sintaxis que está utilizando es en realidad la de la restricción de look-behind, aunque de acuerdo con los documentos, <
debe ir seguido de =
(look-behind positivo) o !
(look-behind negativo).