Las expresiones regulares definen patrones de cadenas.
Las expresiones regulares se pueden utilizar para buscar, editar o manipular texto.
Las expresiones regulares no se limitan a un idioma, sino que existen diferencias sutiles en cada idioma.
Las expresiones regulares de Java son más similares a las de Perl.
El paquete java.util.regex incluye principalmente las siguientes tres clases:
Clase de patrón:
El objeto de patrón es una representación compilada de una expresión regular. La clase de patrón no tiene constructor público. Para crear un objeto Pattern, primero debe llamar a su método de compilación estática pública, que devuelve un objeto Pattern. Este método acepta una expresión regular como primer parámetro.
Clase de emparejamiento:
El objeto Matcher es un motor que interpreta y compara cadenas de entrada. Al igual que la clase Pattern, Matcher no tiene un constructor público. Debe llamar al método matcher del objeto Pattern para obtener un objeto Matcher.
Excepción de sintaxis de patrón:
PatternSyntaxException es una clase de excepción no obligatoria que representa un error de sintaxis en un patrón de expresión regular.
La captura de grupos es una forma de tratar varios personajes como una sola unidad, creada agrupando personajes entre paréntesis.
Por ejemplo, la expresión regular (perro) crea un único grupo que contiene "d", "o" y "g".
Los grupos de captura se numeran contando sus corchetes iniciales de izquierda a derecha. Por ejemplo, en la expresión ((A)(B(C))), hay cuatro grupos de este tipo:
((ABECEDARIO)))
(A)
(ANTES DE CRISTO))
(DO)
Puede comprobar cuántos grupos tiene una expresión llamando al método groupCount del objeto coincidente. El método groupCount devuelve un valor int, lo que indica que el objeto coincidente tiene actualmente varios grupos de captura.
También hay un grupo especial (grupo 0) que siempre representa la expresión completa. El grupo no está incluido en el valor de retorno de groupCount.
El siguiente ejemplo muestra cómo encontrar una cadena de dígitos a partir de una cadena determinada:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
clase pública RegexMatches
{
principal vacío estático público (argumentos de cadena []) {
// Busca la cadena según el patrón especificado String line = "¡Este pedido fue realizado para QT3000! ¿OK?";
Patrón de cadena = "(.*)(\d+)(.*)";
//Crear objeto Patrón Patrón r = Pattern.compile(pattern);
// Ahora crea un objeto comparador Matcher m = r.matcher(line);
si (m.find( )) {
System.out.println("Valor encontrado: " + m.group(0) );
System.out.println("Valor encontrado: " + m.group(1) );
System.out.println("Valor encontrado: " + m.group(2) );
} demás {
System.out.println("NO HAY COINCIDENCIA");
}
}
}
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
Valor encontrado: Este pedido se realizó por QT3000, ¿vale?
Valor encontrado: Este pedido fue realizado por QT300
Valor encontrado: 0
personaje | ilustrar |
---|---|
| Marque el siguiente carácter como carácter especial, texto, referencia inversa o carácter de escape octal. Por ejemplo, "n" coincide con el carácter "n". "n" coincide con un carácter de nueva línea. La secuencia "\" coincide con "" y "(" coincide con "(". |
^ | Coincide con el comienzo de la cadena de entrada. Si se establece la propiedad Multiline del objeto RegExp , ^ también coincidirá con la posición después de "n" o "r". |
$ | Coincide con el final de la cadena de entrada. Si se establece la propiedad Multiline del objeto RegExp , $ también coincidirá con la posición antes de "n" o "r". |
* | Coincide con el carácter o subexpresión anterior cero o más veces. Por ejemplo, zo* coincide con "z" y "zoo". * Equivalente a {0,}. |
+ | Coincide con el carácter o subexpresión anterior una o más veces. Por ejemplo, "zo+" coincide con "zo" y "zoo", pero no con "z". + Equivalente a {1,}. |
? | Coincide con el carácter o subexpresión anterior cero o una vez. Por ejemplo, "do(s)?" coincide con "do" o "do" en "does". ? Equivalente a {0,1}. |
{ n } | n es un número entero no negativo. Coincide exactamente n veces. Por ejemplo, "o{2}" no coincide con la "o" de "Bob", pero sí coincide con ambas "o" de "comida". |
{ n ,} | n es un número entero no negativo. Coincide al menos n veces. Por ejemplo, "o{2,}" no coincide con la "o" de "Bob", pero coincide con todas las o de "foooood". "o{1,}" es equivalente a "o+". "o{0,}" equivale a "o*". |
{ norte , metro } | M y n son números enteros no negativos, donde n <= m . Coincide al menos n veces y como máximo m veces. Por ejemplo, "o{1,3}" coincide con las tres primeras o en "fooooood". 'o{0,1}' es equivalente a 'o?'. Nota: No puede insertar espacios entre comas y números. |
? | Cuando este carácter sigue inmediatamente a cualquier otro calificador (*, +, ?, { n }, { n ,}, { n , m }), el patrón coincidente es "no codicioso". El patrón "no codicioso" coincide con la cadena más corta posible, mientras que el patrón "codicioso" predeterminado coincide con la cadena más larga posible. Por ejemplo, en la cadena "oooo", "o+?" coincide solo con una "o", mientras que "o+" coincide con todas las "o". |
. | Coincide con cualquier carácter excepto "rn". Para hacer coincidir cualquier carácter, incluido "rn", utilice un patrón como "[sS]". |
( patrón ) | Coincide con un patrón y captura la subexpresión coincidente. Las coincidencias capturadas se pueden recuperar de la colección de "coincidencias" resultante utilizando los atributos $0…$9 . Para hacer coincidir el carácter de corchete ( ), utilice "(" o ")". |
(?: patrón ) | Una subexpresión que coincide con el patrón pero no captura la coincidencia, es decir, es una coincidencia que no captura y no almacena la coincidencia para su uso posterior. Esto resulta útil al combinar partes de un patrón utilizando el carácter "o" (|). Por ejemplo, 'industr(?:y|ies) es una expresión más económica que 'industria|industrias'. |
(?= patrón ) | Una subexpresión que realiza una búsqueda anticipada que coincide con una cadena al principio de una cadena que coincide con el patrón . Es una coincidencia sin captura, es decir, una coincidencia que no se puede capturar para su uso posterior. Por ejemplo, 'Windows (?=95|98|NT|2000)' coincide con "Windows" en "Windows 2000", pero no con "Windows" en "Windows 3.1". Las predicciones anticipadas no ocupan caracteres, es decir, después de que se produce una coincidencia, la siguiente coincidencia se busca inmediatamente después de la anterior, no después de los caracteres que componen la predicción anticipada. |
(?! patrón ) | Una subexpresión que realiza una búsqueda hacia atrás que coincide con una cadena de búsqueda que no está al principio de una cadena que coincide con el patrón . Es una coincidencia sin captura, es decir, una coincidencia que no se puede capturar para su uso posterior. Por ejemplo, 'Windows (?!95|98|NT|2000)' coincide con "Windows" en "Windows 3.1" pero no con "Windows" en "Windows 2000". Las predicciones anticipadas no ocupan caracteres, es decir, después de que se produce una coincidencia, la siguiente coincidencia se busca inmediatamente después de la anterior, no después de los caracteres que componen la predicción anticipada. |
x | | Haga coincidir x o y . Por ejemplo, 'z|comida' coincide con "z" o "comida". '(z|f)ood' coincide con "zood" o "comida". |
[ xyz ] | Conjunto de caracteres. Coincide con cualquier carácter contenido en . Por ejemplo, "[abc]" coincide con la "a" en "normal". |
[^ xyz ] | Juego de caracteres inverso. Coincide con cualquier carácter no incluido. Por ejemplo, "[^abc]" coincide con "p", "l", "i" y "n" en "normal". |
[ az ] | Rango de caracteres. Coincide con cualquier carácter dentro del rango especificado. Por ejemplo, "[az]" coincide con cualquier letra minúscula en el rango de "a" a "z". |
[^ az ] | Carácter de rango inverso. Coincide con cualquier carácter que no esté dentro del rango especificado. Por ejemplo, "[^az]" coincide con cualquier carácter que no esté en el rango de "a" a "z". |
b | Coincide con el límite de una palabra, es decir, la posición entre una palabra y un espacio. Por ejemplo, "erb" coincide con "er" en "never", pero no con "er" en "verb". |
B | Coincidencia de límites sin palabras. "erB" coincide con "er" en "verbo", pero no con "er" en "never". |
cx | Coincide con el carácter de control indicado por x . Por ejemplo, cM coincide con Control-M o un carácter de retorno de carro. El valor de x debe estar entre AZ o az. Si este no es el caso, se supone que c es el propio carácter "c". |
d | Coincidencia de caracteres numéricos. Equivalente a [0-9]. |
D | Coincide con caracteres no numéricos. Equivalente a [^0-9]. |
F | Coincidencias de avance de formulario. Equivalente a x0c y cL. |
norte | Coincidencia de nueva línea. Equivalente a x0a y cJ. |
r | Coincide con un carácter de retorno de carro. Equivalente a x0d y cM. |
s | Coincide con cualquier carácter de espacio en blanco, incluidos espacios, tabulaciones, avances de formulario, etc. Equivalente a [fnrtv]. |
S | Coincide con cualquier carácter que no sea un espacio en blanco. Equivalente a [^fnrtv]. |
t | Coincidencia de pestañas. Equivalente a x09 y cI. |
v | Coincidencia de pestañas verticales. Equivalente a x0b y cK. |
w | Coincide con cualquier tipo de carácter, incluido el guión bajo. Equivalente a "[A-Za-z0-9_]". |
W | Coincide con cualquier carácter que no sea una palabra. Equivalente a "[^A-Za-z0-9_]". |
xn | Coincide con n , donde n es un código de escape hexadecimal. El código de escape hexadecimal debe tener exactamente dos dígitos. Por ejemplo, "x41" coincide con "A". "x041" equivale a "x04"&"1". Permitir códigos ASCII en expresiones regulares. |
número | Coincide con num , donde num es un número entero positivo. Referencia inversa para capturar la coincidencia. Por ejemplo, "(.)1" coincide con dos caracteres idénticos consecutivos. |
n | Identifica un código de escape octal o una referencia inversa. Si n está precedido por al menos n subexpresiones de captura, entonces n es una referencia inversa. De lo contrario, si n es un número octal (0-7), entonces n es el código de escape octal. |
nm | Identifica un código de escape octal o una referencia inversa. Si nm está precedido por al menos nm que captura subexpresiones, entonces nm es una referencia inversa. Si nm está precedido por al menos n capturas, n es una referencia inversa seguida del carácter m . Si no existe ninguna de las condiciones anteriores, nm coincide con el valor octal nm , donde n y m son dígitos octales (0-7). |
nml | Cuando n es un número octal (0-3) y myl son números octales (0-7), coincida con el código de escape octal nml . |
u n | Coincide con n , donde n es un carácter Unicode representado como un número hexadecimal de cuatro dígitos. Por ejemplo, u00A9 coincide con el símbolo de copyright (©). |
El método de índice proporciona valores de índice útiles que indican exactamente en qué parte de la cadena de entrada se encuentra la coincidencia:
número de serie | Métodos e instrucciones. |
---|---|
1 | public int start() devuelve el índice inicial de la coincidencia anterior. |
2 | public int start(int group) Devuelve el índice inicial de la subsecuencia capturada por el grupo dado durante la operación de coincidencia anterior |
3 | public int end() devuelve el desplazamiento después del último carácter coincidente. |
4 | public int end(int group) Devuelve el desplazamiento después del último carácter de la subsecuencia capturado por el grupo dado durante la operación de coincidencia anterior. |
El método de investigación examina la cadena de entrada y devuelve un valor booleano que indica si se encontró el patrón:
número de serie | Métodos e instrucciones. |
---|---|
1 | public boolean lookingAt() intenta hacer coincidir una secuencia de entrada que comienza desde el principio del rango con este patrón. |
2 | public boolean find() intenta encontrar la siguiente subsecuencia de la secuencia de entrada que coincida con este patrón. |
3 | public boolean find(int start) Restablece este comparador y luego intenta encontrar la siguiente subsecuencia de la secuencia de entrada comenzando en el índice especificado que coincide con este patrón. |
4 | public booleanmatches() intenta hacer coincidir todo el rango con el patrón. |
El método de reemplazo es un método para reemplazar texto en la cadena de entrada:
número de serie | Métodos e instrucciones. |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) implementa pasos de adición y reemplazo sin terminales. |
2 | public StringBuffer appendTail(StringBuffer sb) implementa los pasos de adición y reemplazo de terminales. |
3 | public String replaceAll(Reemplazo de cadena) Reemplaza cada subsecuencia de la secuencia de entrada cuyo patrón coincide con la cadena de reemplazo dada. |
4 | public String replaceFirst(Reemplazo de cadena) Reemplaza la primera subsecuencia de la secuencia de entrada cuyo patrón coincide con la cadena de reemplazo dada. |
5 | public static String quoteReplacement(String s) devuelve la cadena de reemplazo literal de la cadena especificada. Este método devuelve una cadena que funciona como una cadena literal pasada al método appendReplacement de la clase Matcher. |
A continuación se muestra un ejemplo de cómo contar el número de apariciones de la palabra "gato" en una cadena de entrada:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
clase pública RegexMatches
{
cadena final estática privada REGEX = "\bcat\b";
Cadena final estática privada ENTRADA =
"gato gato gato gato gato";
principal vacío estático público (argumentos de cadena []) {
Patrón p = Patrón.compile(REGEX);
Matcher m = p.matcher(INPUT); // Obtener el objeto de comparación int count = 0;
while(m.buscar()) {
contar++;
System.out.println("Número de coincidencia "+cuenta);
System.out.println("inicio(): "+m.inicio());
System.out.println("end(): "+m.end());
}
}
}
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
Partido número 1
inicio(): 0
final(): 3
Partido número 2
inicio(): 4
final(): 7
Partido número 3
inicio(): 8
final(): 11
Partido número 4
inicio(): 19
final(): 22
Puede ver que este ejemplo utiliza límites de palabras para garantizar que las letras "c" "a" "t" no sean solo una subcadena de una palabra más larga. También proporciona información útil sobre en qué parte de la cadena de entrada se produjo la coincidencia.
El método de inicio devuelve el índice inicial de la subsecuencia capturada por el grupo dado durante la operación de coincidencia anterior, y el método de finalización agrega uno al índice del último carácter coincidente.
Los métodosmatches ylookingAt se utilizan para intentar hacer coincidir un patrón de secuencia de entrada. La diferencia entre ellos es que las coincidencias requieren que toda la secuencia coincida, mientras que LookingAt no.
Estos dos métodos se utilizan a menudo al principio de la cadena de entrada.
Usamos el siguiente ejemplo para explicar esta función:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
clase pública RegexMatches
{
cadena final estática privada REGEX = "foo";
Cadena final estática privada ENTRADA = "fooooooooooooooooo";
patrón de patrón estático privado;
comparador estático privado;
principal vacío estático público (argumentos de cadena []) {
patrón = Patrón.compile(REGEX);
comparador = patrón.matcher(ENTRADA);
System.out.println("REGEX actual es: "+REGEX);
System.out.println("La ENTRADA actual es: "+ENTRADA);
System.out.println("mirando(): "+matcher.mirando());
System.out.println("coincidencias(): "+matcher.matches());
}
}
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
REGEX actual es: foo
La ENTRADA actual es: fooooooooooooooooo
mirando(): verdadero
coincidencias(): falso
Los métodos replaceFirst y replaceAll se utilizan para reemplazar texto que coincide con una expresión regular. La diferencia es que reemplazarPrimero reemplaza la primera coincidencia y reemplazarTodo reemplaza todas las coincidencias.
El siguiente ejemplo explica esta funcionalidad:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
clase pública RegexMatches
{
Cadena estática privada REGEX = "perro";
cadena estática privada ENTRADA = "El perro dice miau." +
"Todos los perros dicen maullar.";
Cadena estática privada REPLACE = "gato";
público estático vacío principal (String [] argumentos) {
Patrón p = Patrón.compile(REGEX);
//obtenemos un objeto coincidente
Emparejador m = p.matcher(ENTRADA);
ENTRADA = m.reemplazarTodo(REEMPLAZAR);
System.out.println(ENTRADA);
}
}
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
El gato dice miau. Todos los gatos dicen miau.
La clase Matcher también proporciona métodos appendReplacement y appendTail para reemplazar texto:
Mire el siguiente ejemplo para explicar esta funcionalidad:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
clase pública RegexMatches
{
Cadena estática privada REGEX = "a*b";
Cadena estática privada INPUT = "aabfooaabfooabfoob";
Cadena estática privada REPLACE = "-";
público estático vacío principal (String [] argumentos) {
Patrón p = Patrón.compile(REGEX);
// Obtener el objeto comparador Matcher m = p.matcher(INPUT);
StringBuffer sb = nuevo StringBuffer();
mientras(m.buscar()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
-foo-foo-foo-
PatternSyntaxException es una clase de excepción no forzada que indica un error de sintaxis en un patrón de expresión regular.
La clase PatternSyntaxException proporciona los siguientes métodos para ayudarnos a ver qué errores ocurrieron.
número de serie | Métodos e instrucciones. |
---|---|
1 | public String getDescription() Obtiene la descripción del error. |
2 | public int getIndex() obtiene el índice incorrecto. |
3 | public String getPattern() obtiene el patrón de expresión regular incorrecto. |
4 | public String getMessage() devuelve una cadena multilínea que contiene una descripción del error de sintaxis y su índice, el patrón de expresión regular del error y una indicación visual del índice del error en el patrón. |