pattern - regex java online
Expresión regular llamada soporte de grupos de captura en Java 7 (2)
Desde Java 7 expresiones regulares API ofrece soporte para grupos de captura de nombre. El método java.util.regex.Matcher.group(String) devuelve la subsecuencia de entrada capturada por el grupo de captura de nombre dado, pero no hay ningún ejemplo disponible en las documentaciones API.
¿Cuál es la sintaxis correcta para especificar y recuperar un grupo de captura con nombre en Java 7?
Especificando grupo de captura nombrado
Use la siguiente expresión regular con un solo grupo de captura como ejemplo ([Pp]attern)
.
A continuación se muestran 4 ejemplos sobre cómo especificar un grupo de captura con nombre para la expresión regular anterior:
(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)
Tenga en cuenta que el nombre del grupo de captura debe coincidir estrictamente con el siguiente patrón:
[A-Za-z][A-Za-z0-9]*
El nombre del grupo distingue entre mayúsculas y minúsculas, por lo que debe especificar el nombre exacto del grupo cuando se refiere a ellos (ver más abajo).
Hacer una referencia inversa al grupo de captura nombrado en regex
Para hacer una referencia al contenido que coincide con un grupo de captura con nombre en la expresión regular (corresponde a los 4 ejemplos anteriores):
/k<Name>
/k<group1>
/k<name>
/k<NAME>
El grupo de captura con nombre todavía está numerado, por lo que en los 4 ejemplos, se puede hacer una referencia /1
con /1
según lo normal.
Consulte el grupo de captura con nombre en la cadena de reemplazo
Para referirse al grupo de captura en la cadena de reemplazo (corresponde a los 4 ejemplos anteriores):
${Name}
${group1}
${name}
${NAME}
Igual que arriba, en los 4 ejemplos, se puede hacer referencia al contenido del grupo de captura con $1
en la cadena de reemplazo.
Grupo de captura con nombre en modo COMMENT
Usando (?<name>[Pp]attern)
como ejemplo para esta sección.
La implementación de Oracle del modo COMMENT
(marca incrustada (?x)
) analiza los siguientes ejemplos para que sean idénticos a la expresión regular anterior:
(?x) ( ?<name> [Pp] attern )
(?x) ( ?< name > [Pp] attern )
(?x) ( ?< n a m e > [Pp] attern )
Con la excepción de ?<
Que no debe separarse, permite el espaciado arbitrario incluso entre el nombre del grupo de captura.
¿El mismo nombre para diferentes grupos de captura?
Si bien es posible en .NET, Perl y PCRE definir el mismo nombre para diferentes grupos de captura, actualmente no es compatible con Java (Java 8). No puedes usar el mismo nombre para diferentes grupos de captura.
APIs relacionadas con el grupo de captura con nombre
Nuevos métodos en la clase Matcher para admitir la recuperación de texto capturado por nombre de grupo:
-
group(String name)
(de Java 7) -
start(String name)
(desde Java 8 ) -
end(String name)
(desde Java 8 )
Falta el método correspondiente en la clase MatchResult
partir de Java 8. Hay una solicitud de mejora en curso JDK-8065554 para este problema.
Actualmente no hay API para obtener la lista de grupos de captura nombrados en la expresión regular. Tenemos que saltar a través de aros extra para conseguirlo . Aunque es bastante inútil para la mayoría de los propósitos, excepto para escribir un probador de expresiones regulares.
La nueva sintaxis para un grupo de captura con nombre es (?<name>X)
para un grupo coincidente X llamado "nombre". El siguiente código captura la expresión regular (/ w +) (cualquier grupo de caracteres alfanuméricos). Para nombrar a este grupo de captura debes agregar la expresión? dentro de los paréntesis justo antes de la expresión regular a capturar.
Pattern compile = Pattern.compile("(?<teste>//w+)");
Matcher matcher = compile.matcher("The first word is a match");
matcher.find();
String myNamedGroup= matcher.group("teste");
System.out.printf("This is yout named group: %s", myNamedGroup);
Este código devuelve imprime el siguiente resultado:
Este es tu grupo nombrado: El