Tema 2 · Métodos RegExp

2. Métodos Propios de RegExp: test(), exec() y el Estado lastIndex

Aprende a usar regex.test() para validaciones booleanas ultrarrápidas y regex.exec() para extracción con iteración segura.

Los Métodos Propios del Prototipo RegExp

A diferencia de métodos de texto como str.match() o str.replace(), los métodos regex.test() y regex.exec() pertenecen directamente a la instancia de RegExp.

  • regex.test(str): Devuelve un booleano puro (true o false). Es el método más rápido en JavaScript cuando solo necesitas comprobar existencia o validar una regla sin extraer subcadenas.
  • regex.exec(str): Devuelve un array detallado con la primera coincidencia encontrada (o null si no hay match), incluyendo el índice de inicio, la entrada original y los grupos de captura.

El Gran Peligro de lastIndex con la Bandera /g

Uno de los errores más frustrantes en JavaScript para desarrolladores junior ocurre cuando se utiliza una expresión regular con la bandera global /g o pegajosa /y junto a test() o exec():

⚠️ Comportamiento con Estado (Stateful RegExp): Cuando una RegExp tiene la bandera /g, el objeto guarda en su propiedad regex.lastIndex la posición donde terminó la última coincidencia. La siguiente llamada a test() o exec() continuará desde ese índice, provocando que validaciones idénticas alternen entre true y false.

Para evitar este efecto secundario indeseado en validaciones simples, nunca utilices la bandera /g con test(). Si necesitas reiniciar el rastreo manualmente, asigna regex.lastIndex = 0;.

⚡ Uso de test(), exec() y el Comportamiento de lastIndex

Demuestra la validación booleana con test(), el bug clásico de lastIndex con la bandera /g, y la extracción en bucle con exec().

test-vs-exec.js
Solo lectura
// 1. Validación booleana sin estado (Recomendado sin flag 'g')
const patronEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log("--- 1. Validación limpia con regex.test() ---");
console.log("[email protected]:", patronEmail.test("[email protected]")); // true
console.log("correo-invalido.com:   ", patronEmail.test("correo-invalido.com"));    // false

// 2. La trampa de lastIndex con la bandera /g
console.log("\n--- 2. La trampa de lastIndex con /g ---");
const regexConG = /^[a-z]+$/g;
const texto = "kilopolis";

console.log("Llamada 1 test():", regexConG.test(texto)); // true
console.log("lastIndex actual:", regexConG.lastIndex);  // 9 (final de la palabra)
console.log("Llamada 2 test():", regexConG.test(texto)); // false! (busca a partir del índice 9)
console.log("lastIndex tras fallo:", regexConG.lastIndex); // 0 (se reinicia)
console.log("Llamada 3 test():", regexConG.test(texto)); // true de nuevo

// 3. Extracción iterativa con regex.exec()
console.log("\n--- 3. Extracción en bucle con regex.exec() ---");
const logServidor = "ERR_404 en /inicio; ERR_500 en /checkout; ERR_403 en /admin;";
const regexError = /ERR_(\d{3})/g;
let coincidencia;

while ((coincidencia = regexError.exec(logServidor)) !== null) {
  console.log(`Código encontrado: ${coincidencia[1]} en índice: ${coincidencia.index}`);
  console.log(`Siguiente búsqueda iniciará en lastIndex: ${regexError.lastIndex}`);
}
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
Si defines const r = /foo/g; y ejecutas r.test("foo") dos veces consecutivas sobre la misma cadena, ¿qué devuelve cada llamada?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Regex en JavaScript: Expresiones Regulares & RegExp y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.