Búsqueda con patrones
Los patrones o expresiones regulares permiten hacer búsquedas de texto usando un esquema o patrón en lugar de un valor concreto. Por ejemplo: buscar letras minúsculas en una frase solo puede hacerse con patrones.
El objeto String provee tres métodos para esta operación (que se suman a los orecidos por el objeto RegExp).
- match(er ) devuelve un array con todas las coincidencias encontradas
- matchAll(er ) devuelve un iterador para todas las coincidencias
- search(er ) busca la primera coincidencia
Los tres usan una expresión regular o patrón de búsqueda. La difrencia entre ellos radica en que match() y matchAll() devuelven o pueden devolver todo lo que concuerda con el patrón. Mientras que search() devuelve el índice de la primera coincidencia (o -1 si no la encuentra).
Todos llevan como argumento un patrón o una cadena que internamente será convertida en patrón por Javascript. Lo mejor es colocar un patrón con el flag de global (g) para que devuelva todas las concordancias.
Para entender el funcinoamiento de estos métodos es necesario conocer el uso de las expresiones regulares. Recuerda que son un ampliación (enorme) al uso de comodines en nombres de archivos.
En este ejemplo vamos a buscar la hora del evento, que podemos definirla como una cadena formada por uno o dos dígitos seguidos de dos puntos y seguido de uno o dos dígitos comenzando por 0-6, como 14:50 o 8:25 o 13:5
var evento = "La comida es a las 14:00 y la cena a las 21:30 horas";
var patron = /[0-9]{1,2}:[0-6][0-9]{0,1}/g;
var hora;
hora = evento.match(patron)
console.log("Eventos "+hora[0]+" y "+hora[1] )
El buscador match() comprueba todos los segmentos de texto que concueradan con el patrón y devuelve un array con los contenidos encontrados, o sea, las subcadenas que se ajustan a la definición de la expresión regular. Al usar el flga g recorre toda la cadena
Veamos ahora el mismo ejemplo usando mathAll(), este método exige un patrón con el flag global, si no dispara un error.
var evento = "La comida es a las 14:00 y la cena a las 21:30 horas";
var patron = /[0-9]{1,2}:[0-9]{1,2}/g;
var horas;
horas = evento.matchAll(patron)
for(let h of horas) {
console.log(h[0]);
}
Cada elemento del iterador es un array con información sobre la coincidencia, posición, array donde se buscó. Compruébalo cambiando el cuerpo del bucle
var evento = "La comida es a las 14:00 y la cena a las 21:30 horas";
var patron = /[0-9]{1,2}:[0-9]{1,2}/g;
var horas;
horas = evento.matchAll(patron)
for(let h of horas) {
console.log(h);
}
Ya solo queda ver como usar el último método search(), usamos el mismo ejemplo
var evento = "La comida es a las 14:00 y la cena a las 21:30 horas";
var patron = /[0-9]{1,2}:[0-9]{1,2}/g;
var horas;
horas = evento.search(patron)
console.log(horas); //19
Como ves ese método solo devuelve el índice de la primera coincidencia. Si no existen coincidencias devolvería -1. Comparado con los otros métodos es bastante pobre, pero en algunos casos también puede se útil.