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).
Clases de caracteres predefinidas
La API de clasesPattern
contiene clases de caracteres predefinidas que ofrecen atajos convenientes para expresiones regulares de uso común. En esta tabla, las construcciones de la columna de la izquierda son representaciones abreviadas de las expresiones de la columna de la derecha. Por ejemplo, \d
significa un número (0-9), \w
significa 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 \Q
y \E
usarlos 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: En 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
Los 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: En 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: los 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": ¿ Expresió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": el 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: La 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: Para 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: en 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.
GO TO FULL VERSION