Estoy tratando de validar un nombre de usuario con RegEx en Javascript y, aunque el resultado de .test es verdadero, todo funciona bien, pero (a veces) cuando uso una cadena que no coincide, mi aplicación se rompe y aparece el error Demasiada recursividad . Quiero saber en qué parte de mi RegEx (o código) me equivoqué para causar tal cosa.
Este es mi código (RegEx):
console.log(/^[A-Za-zÀ-ÖØ-öø-ÿ]([ _]?[A-Za-z0-9À-ÖØ-öø-ÿ]+)+$/g.test("RegExr was created by gskinner_com_and is proudly hosted by Media Temple"));Quiero que la cadena correcta comience con una letra, luego tenga cualquier combinación de letras y dígitos con espacios y guiones bajos permitidos entre ellos, pero solo uno a la vez.
La expresión regular funciona en sitios web relacionados con la prueba, y en mi propio código, y recibo el error cuando la entrada no válida está lejos del comienzo de la cadena, de hecho, mi computadora tarda más en calcular el resultado cuanto más pongo el error (Digamos un punto o 2 espacios uno detrás del otro) hasta que en cierto punto me sale el error. o el uso de demasiados caracteres como ¿Cuál es el problema? posición del $ o el uso de demasiados caracteres como À-ÖØ-öø-ÿ ? y que puedo hacer para solucionarlo?
El retroceso catastrófico se debe a los cuantificadores anidados en el grupo. Si el patrón no puede coincidir, los cuantificadores anidados permiten que muchas posiciones retrocedan, aún tratando de obtener una coincidencia.
Puede comenzar el patrón haciendo coincidir un solo carácter y luego, opcionalmente, hacer coincidir uno de la clase de caracteres [A-Za-z0-9À-ÖØ-öø-ÿ]*
Luego, en el grupo repetido, haga coincidir un espacio o un guión bajo [ _] seguido de 1 o más veces la clase de carácter ya existente [A-Za-z0-9À-ÖØ-öø-ÿ]+
Esto no desactiva el retroceso, sino que elimina un cuantificador anidado para permitir menos posiciones a las que retroceder.
Tenga en cuenta que repetir un grupo de captura captura el valor de la última iteración. Si no necesita el valor del grupo de captura después, puede convertirlo en un grupo que no sea de captura utilizando (?: en su lugar.
^[A-Za-zÀ-ÖØ-öø-ÿ][A-Za-z0-9À-ÖØ-öø-ÿ]*(?:[ _][A-Za-z0-9À-ÖØ-öø-ÿ]+)+$Demostración de expresiones regulares
Para hacer coincidir también una sola palabra, puede hacer que el cuantificador * para el grupo coincida cero o más veces:
^[A-Za-zÀ-ÖØ-öø-ÿ][A-Za-z0-9À-ÖØ-öø-ÿ]*([ _][A-Za-z0-9À-ÖØ-öø-ÿ]+)*$