Expresiones Regulares

<< Fechas Browser Object Model >>

Las expresiones regulares nos permiten buscar patrones en un string, por tanto buscar el trozo que coincida o cumpla dicha expresión. En JavaScript, podemos crear una expresión regular instanciando un objeto de la clase RegExp o escribiendo directamente la expresión entre dos barras '/'.

Una expresión también puede tener uno o más modificadores como 'g' → Búsqueda global (Busca todas las coincidencias y no sólo la primera), 'i' → Case-insensitive (No distingue entre mayúsculas y minúsculas), o 'm' → Búsqueda en más de una línea (Sólo tiene sentido en cadenas con saltos de línea). En Javascript puedes crear un objeto de expresión regular con estos modificadores de dos formas. Ejemplo:

let reg  = new RegExp("^[a-z]","gi");
let reg2 = /^[a-z]/gi;
console.log(reg2 instanceof RegExp); // Imprime true

Métodos para trabajar con expresiones regulares

Comprobar si una cadena cumple un patrón

El método test() recibe una cadena e intenta de encontrar una la coincidencia con la expresión regular. Si el modificador global 'g' se especifica, cada vez que se llame al método se ejecutará desde la posición en la que se encontró la última coincidencia, por tanto podemos saber cuántas coincidencias se encuentran. Debemos recordar que si usamos el modificador 'i' no diferencia entre mayúsculas y minúsculas.

let str = "I am amazed in America";
let reg = /am/g;
console.log(reg.test(str)); // Imprime true
console.log(reg.test(str)); // Imprime true
console.log(reg.test(str)); // Imprime false, hay solo dos coincidencias

let reg2 = /am/gi; // "Am" será lo que busque ahora
console.log(reg.test(str)); // Imprime true
console.log(reg.test(str)); // Imprime true
console.log(reg.test(str)); // Imprime true. Ahora tenemos 3 coincidencias con este nuevo patrón

Buscar coincidencias en una cadena

Si queremos más detalles sobre las veces que se repite un patrón dentro de una cadena, podríamos usar el método exec(). Este método devuelve un objeto con los detalles cuando encuentra alguna coincidencia. Estos detalles incluyen el índice en el que empieza la coincidencia y también el string entero.

let str = "I am amazed in America";
let reg = /am/gi;
console.log(reg.exec(str)); // Imprime ["am", index: 2, input: "I am amazed in America"]
console.log(reg.exec(str)); // Imprime ["am", index: 5, input: "I am amazed in America"]
console.log(reg.exec(str)); // Imprime ["Am", index: 15, input: "I am amazed in America"]
console.log(reg.exec(str)); // Imprime null. No hay más coincidencias

Una forma de recorrer dichas coincidencias sería esta:

let str = "I am amazed in America";
let reg = /am/gi;
let match;
while(match = reg.exec(str)) {
    console.log("Patrón encontrado!: " + match[0] + ", en la posición: " + match.index);
}
/* Esto imprimirá:
  * Patrón encontrado!: am, en la posición: 2
  * Patrón encontrado!: am, en la posición: 5
  * Patrón encontrado!: Am, en la posición: 15 */

De forma similar, hay métodos de la clase String que podemos usar, estos admiten expresiones regulares como parámetros (vamos, a la inversa). Estos métodos son match (Funciona de forma similar a exec) y replace.

El método match devuelve un array con todas las coincidencias encontradas en la cadena si ponemos el modificador global → g, si no ponemos el modificador global, se comporta igual que exec().

let str = "I am amazed in America";
console.log(str.match(/am/gi)); // Imprime ["am", "am", "Am"]

Sustitución de patrones

El método replace devuelve una nueva cadena con las coincidencias de la expresión regular reemplazadas por la cadena que le pasamos como segundo parámetro (si el modificador global no se especifica, sólo se modifica la primera coincidencia). Podemos enviar una función anónima que procese cada coincidencia encontrada y nos devuelva la cadena con los reemplazos correspondientes.

let str = "I am amazed in America";
console.log(str.replace(/am/gi, "xx")); // Imprime "I xx xxazed in xxerica"
console.log(str.replace(/am/gi, function(match) {
    return "-" + match.toUpperCase() + "-";
})); // Imprime "I -AM- -AM-azed in -AM-erica"

<< Fechas Browser Object Model >>