Buscar con patrones

El método patron.exec(cadena) hace una búsqueda en la cadena argumento para encontrar coincidencias con el patrón.

Si no se encuentra ninguna coincidencia la propiedad lastIndex del patrón de búsqueda se pone a 0 y el método devuelve el valor null.

En caso de encontrar coincidencias las devuelve dentro de un array, al que además le añade las propiedades

  • index posición de la coincidencia
  • input: cadena donde se ha buscado
  • groups grupos con nombre si se hubieran definido

Hay que tener en cuenta que la búsqueda solo devuelve la primera coincidencia, si se quieren todas hay que usar el modificador g (global) y hacer búsquedas sucesivas hasta que el método devuelva null. Cada nueva búsqueda comenzará en la posición de la cadena señalada en lastIndex

Si el patrón contiene subpatrones (los caracteres entre paréntesis) estos se guardan en el array devuelto. Cada índice del array devuelto se corresponde con la posición del subpatrón dentro de la expresión regular.

var email="El email es juan@example.com";

var res = [];

var patron;

patron = /([a-z0-9]+)@([a-z]+\.[a-z]{2,3})/i

res = patron.exec(email);

console.log("Email "+res[0] );

console.log("Nombre "+res[1] );

console.log("Dominio "+res[2] );

console.log("Hallado en posición "+res.index );

El array resultado contiene en la primera posición (indice 0) la coincidencia completa con el patrón, y en los indices siguientes están los subpatrones hallados en la búsqueda.

Una búsqueda repetitiva necesita del modificador g y un bucle en el que se repetirá la búsqueda hasta que no hayan coincidencias (devuelva null).

var datos="100 30 3450 23 156 120";
var res;
patron = /\b[1-9][0-9]{2}\b/g
do{
res = patron.exec(datos);
if (res != null)
    console.log(res[0]);
}while (res != null)

En el ejemplo se buscan todos los números de tres dígitos de la lista de números. Usamos un bucle do que hace al menos una búsqueda: si no encuentra no imprimea nada, pero si encuentra lo imprime y repite el proceso. También se puede usar el bucle while

Solo hay que tener la precaución habitual en los bucles: que la condición de final sea alcanzable para evitar entrar en un bucle infinito.

Otro ejemplo, en el que vamos a usar el objeto groups que aparece en el array devuelto, junto a index y input

var aulas = "ingles: A1, frances:F2, lengua:K3";

var patAula = /\b([A-Z]+):\s*(?<aula>[A-Z]\d)\b/ig;

var res;

while ((res=patAula.exec(aulas)) != null){

   console.log("Aula: "+res.groups.aula)

}

scripts