Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

127
Vistas
RegExp.prototype.exec() puede repetirse para siempre

Pasos para reproducir:

  • Abra la página de documentos de MDN: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec .
  • Abra 'Herramientas para devops' y cambie a la pestaña Consola.
  • Reemplace foo* con .* en la página de documentos y haga clic en el botón 'Ejecutar'.

Esto dará como resultado un bucle infinito. ¿Cómo evito que esto suceda? En mi aplicación Node, el usuario puede especificar .* como patrón y se bloquea. No creo que hacer una coincidencia de cadenas y evitar este patrón de expresión regular específico ayude, ya que podría haber muchos otros patrones que darán como resultado un bucle infinito.

Código fuente (en caso de que cambie el contenido de la página de MDN):

 const regex1 = RegExp('.*', 'g');
const str1 = 'text';
let array1;

while ((array1 = regex1.exec(str1)) !== null) {
 console.log(array1.index);
}
almost 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puede agregar una verificación de que la propiedad lastIndex de la expresión regular ha cambiado, y si no lo ha hecho (lo que indica una coincidencia de longitud cero, que luego se repetiría infinitamente), salga del ciclo:

 const regex1 = RegExp('.*', 'g');
const str1 = 'text';
let array1;
let lastIndex = 0;

while ((array1 = regex1.exec(str1)) !== null) {
 console.log(array1);
 if (regex1.lastIndex == lastIndex) break;
 lastIndex = regex1.lastIndex;
}

Tenga en cuenta que puede realizar la prueba antes de hacer nada con el resultado de exec , dependiendo de si desea capturar la coincidencia de longitud cero o no.

almost 4 years ago · Santiago Trujillo Denunciar

0

Todos los patrones que pueden coincidir con una cadena vacía exhiben este comportamiento. ¿Ve Regex que puede coincidir con una cadena vacía está rompiendo el motor de expresiones regulares de JavaScript o expresiones regulares de longitud cero y coincidencias infinitas? .

La solución simple sería simplemente usar matchAll en lugar de probar usted mismo alguna condición de bucle complicada :

 const regex = /.*/g;
const str = 'text';
for (const match of str.matchAll(regex)) {
 console.log(match.index, match[0]);
}

Alternativamente, usar str.match(regex) en lugar de regex.exec(str) también ayudaría.

almost 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda