JavaRush /Blog Java /Random-ES /Conceptos básicos de expresiones regulares en Java. parte...
articles
Nivel 15

Conceptos básicos de expresiones regulares en Java. parte 3

Publicado en el grupo Random-ES
Continuemos nuestro estudio de las expresiones regulares. En este artículo veremos clases de caracteres predefinidas, así como la cuantificación (búsqueda de secuencias). Conceptos básicos de expresiones regulares en Java.  Parte 3 - 1

Clases de caracteres predefinidas

La API de clases Patterncontiene clases de caracteres predefinidas que ofrecen atajos convenientes para expresiones regulares de uso común. Conceptos básicos de expresiones regulares en Java.  Parte 3 - 2En esta tabla, las construcciones de la columna de la izquierda son representaciones abreviadas de las expresiones de la columna de la derecha. Por ejemplo, \dsignifica un número (0-9), \wsignifica cualquier letra mayúscula o minúscula, guión bajo o número). Utilice clases de caracteres predefinidas siempre que sea posible. Esto hará que su código sea más fácil de leer y corregir errores. Las construcciones que comienzan con una barra invertida se denominan escapadas o protegidas. En artículos anteriores, ya hemos hablado sobre cómo escapar de caracteres especiales con barras invertidas o símbolos \Qy \Eusarlos como caracteres normales. Si utiliza una barra invertida con caracteres normales (literales), deberá escapar de la barra invertida para que se compile la expresión.
private final String REGEX = "\\d"; // цифра
En este ejemplo \d, una expresión regular; la barra invertida adicional es necesaria para que el programa se compile. Nuestro programa de prueba lee expresiones regulares directamente desde la consola, por lo que no se necesita barra diagonal adicional. El siguiente ejemplo demuestra el uso de clases de caracteres predefinidas: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 3Conceptos básicos de expresiones regulares en Java.  Parte 3 - 4En los primeros tres ejemplos, la expresión regular es simplemente " ." (el carácter especial de punto), que significa cualquier carácter. Por tanto, la búsqueda fue exitosa en todos los casos. Otros ejemplos utilizan clases de caracteres predefinidas, cuyos significados analizamos en la tabla anterior.

Cuantificadores

Conceptos básicos de expresiones regulares en Java.  Parte 3 - 4Los cuantificadores le permiten especificar el número de apariciones de un carácter en una cadena. Echemos un vistazo más de cerca a las complejidades de cómo funcionan los cuantificadores codiciosos, perezosos y muy codiciosos. A primera vista puede parecer que los cuantificadores X?, X?? y X?+ funcionan de la misma manera: "X está presente una vez o no está presente". Existen ligeras diferencias en la implementación de estos cuantificadores, que veremos a continuación.

Coincidencias de longitud cero

Empecemos por el codicioso. Escribamos tres expresiones regulares diferentes: la letra “a” con caracteres especiales ?, * o +. Veamos qué sucede si probamos estas expresiones regulares en una línea vacía: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 5En el ejemplo anterior, la búsqueda fue exitosa en los dos primeros casos, porque las expresiones a? y a* permiten que falte el carácter a en la cadena. También tenga en cuenta que el índice de inicio y del último partido son los mismos (0). Como la cadena de entrada no tiene longitud, el programa no encuentra nada :) en la primera posición. Este caso se llama coincidencia de longitud cero. Estas coincidencias se producen en varios casos: cuando la línea de entrada está vacía, al principio de la línea de entrada, después del último carácter de la línea o entre caracteres de la línea. Los partidos de duración cero son fáciles de detectar: ​​comienzan y terminan en la misma posición. Veamos algunos ejemplos más de coincidencias de longitud cero. Exploremos coincidencias de longitud cero con algunos ejemplos más. Cambiemos la cadena de entrada al carácter "a" y observemos un efecto interesante: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 6los tres cuantificadores encontraron el carácter "a", pero los dos primeros, que permiten la ausencia de un carácter, encontraron una coincidencia de longitud cero en la posición 1. - después del último carácter de la cadena. Esto sucede porque el programa trata el carácter "a" como una cadena y lo "recorre" hasta que no hay más coincidencias. Dependiendo del cuantificador utilizado, el programa encontrará o no "nada" al final de la cadena. Ahora cambiemos la cadena de entrada a una secuencia de cinco letras "a": ¿ Conceptos básicos de expresiones regulares en Java.  Parte 3 - 7Expresión regular a? encuentra una coincidencia para cada letra de la cadena por separado. La expresión a* encuentra dos coincidencias: la secuencia de caracteres "a"' y una coincidencia de longitud cero en la posición 5. Y finalmente, la expresión regular a+ encuentra solo la secuencia de caracteres “a”, sin encontrar “nada” :) ¿Qué pasará si se da como entrada una cadena que contiene diferentes caracteres? Por ejemplo, "ababaaaab": Conceptos básicos de expresiones regulares en Java.  Parte 3 - 8el carácter "b" está en las posiciones 1, 3 y 8 y el programa encuentra coincidencias de longitud cero en estas posiciones. ¿Expresión regular a? no presta atención a "b", sino que simplemente busca la presencia (o ausencia) del carácter "a". Si el cuantificador permite la ausencia de "a", todos los caracteres de la cadena distintos de "a" se mostrarán como una coincidencia de longitud cero. Para buscar secuencias de una longitud determinada, simplemente especifique la longitud entre llaves: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 9La expresión regular a{3} busca una secuencia de tres caracteres "a". No se encontró nada en la primera línea porque no había suficientes a en la línea. El segundo contiene 3 caracteres, que el programa encuentra. La tercera prueba también encuentra una coincidencia al principio de la cadena. Todo lo que sigue al tercer carácter no satisface la expresión regular; en el código siguiente sí lo hace y habrá varias coincidencias: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 10Para especificar la longitud mínima de la secuencia, use:
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
En este ejemplo, el programa encuentra sólo una coincidencia porque la cadena cumple con el requisito de longitud mínima de secuencia de (3) caracteres "a". Finalmente, estableciendo la longitud máxima de la secuencia: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 11en este ejemplo, la primera coincidencia terminó en el sexto carácter. La segunda coincidencia contiene caracteres después de la sexta, porque Satisfacen el requisito de longitud mínima. Si la cadena fuera un carácter más corta, no habría una segunda coincidencia.

Uso de grupos y clases de caracteres con cuantificadores

Hasta este punto, hemos probado cuantificadores en cadenas que contienen el mismo carácter. Los cuantificadores solo se aplican a un solo carácter, por lo que la expresión regular "abc+" coincidirá con cadenas que contengan "ab" y "c" una o más veces. No significará "abc" una o más veces. Pero los cuantificadores se pueden utilizar junto con grupos y clases de caracteres, como [abc]+ (a o b o c, una o más veces) o (abc)+ (“abc” una o más veces). Busquemos un grupo de caracteres (perro), tres veces en una línea: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 12En el primer ejemplo, el programa encuentra una coincidencia, porque el cuantificador se extiende a un grupo de caracteres. Si elimina los corchetes, el cuantificador {3} solo se aplicará a la letra "g". También puede utilizar cuantificadores con clases de caracteres: Conceptos básicos de expresiones regulares en Java.  Parte 3 - 13el cuantificador {3} se aplica a la clase de caracteres entre paréntesis en el primer ejemplo, y en el segundo, sólo al carácter "c".

Diferencias entre cuantificadores codiciosos, perezosos y demasiado codiciosos

Existen ligeras diferencias entre cuantificadores codiciosos, reacios y posesivos. Los cuantificadores codiciosos se llaman así porque intentan encontrar la coincidencia más larga posible: el programa primero intenta "comerse" toda la cadena, si no se encuentra una coincidencia, luego se descarta un carácter y la búsqueda se repite hasta que se encuentra una coincidencia o no quedan más personajes. Las personas perezosas, por otro lado, comienzan al principio de la línea, agregando carácter tras carácter hasta que encuentran una coincidencia. Finalmente, la cuantificación celosa escanea toda la cadena una vez, sin eliminar caracteres como en codicioso. Para demostración, usaremos la cadena xfooxxxxxxfoo. Conceptos básicos de expresiones regulares en Java.  Parte 3 - 14El primer ejemplo utiliza el cuantificador codicioso .* para encontrar cualquier carácter, 0 o más veces, seguido de los caracteres "f" "o" "o". Dado que el cantificador es codicioso, la coincidencia encontrada contiene la cadena completa. Un cuantificador codicioso no encontrará todas las coincidencias en una cadena porque en el primer paso, después de escanear toda la cadena, encontrará una coincidencia y finalizará el trabajo. El segundo ejemplo es vago y comienza desde el principio de la línea, agregando carácter por carácter. El programa comienza comprobando el "vacío", pero como la secuencia "foo" no está al principio de la línea, la búsqueda continúa agregando el carácter "x", después de lo cual se encontrará la primera coincidencia entre los índices 0 y 4. La búsqueda continúa hasta el final de la línea y la segunda coincidencia se encontrará entre los índices 4 y 13. El tercer ejemplo no encuentra coincidencias porque el cuantificador está celoso. En este caso, la expresión regular .*+ "se comió" toda la línea, sin dejar nada para "foo". Utilice el cuantificador celoso cuando necesite descartar algo innecesario en una cadena; será más efectivo que el cuantificador codicioso equivalente. ¡Eso es todo! Enlace a la fuente: Conceptos básicos de expresiones regulares en Java. parte 3
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION