Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

118
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!