Pasos para reproducir:
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);
}
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.
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.