Necesita ayuda con JavaScript Regular Expression: Regular Expression Too Complex

Siguiente expresión regular ^[0-9A-Za-z]+(\s)*(-?(\s)*[0-9A-Za-z]+)*$ coincide en la mayoría de los casos como, por ejemplo, "dsffsd-fdsfds-dasda" pero cuando le doy una cuerda para que coincida como "dsffsd-fdsfds-dasda-dasdas--dasdas-dsfs" Recibo un error en firebug que dice Expresión regular demasiado compleja.

Cualquier ayuda será apreciada, gracias de antemano.

preguntado el 27 de agosto de 11 a las 14:08

¿Podrías publicar un código lanzando el Expresión regular demasiado compleja error en jsfiddle.net ? -

Si su patrón es demasiado complicado, use el modo extendido a través de /x or (?x) para que pueda leerlo agregando espacios para respirar y comentarios para la explicación: ^ [0-9A-Za-z]+ (\s)* ( -? (\s)* [0-9A-Za-z]+ ) * $. Además, estoy bastante seguro de que ese patrón es incorrecto: tienes cuantificadores alrededor de los grupos de captura, como (\s)* para (\s*). Además, \w es mucho más legible que [0-9A-Za-z]. En la mayoría de los motores de expresiones regulares (pero no en Javascript, que es el peor de todos los motores de expresiones regulares), también es más correcto. Recuérdalo [A-Z] es un antipatrón fuerte que siempre está mal a veces. -

@tchrist no "siempre está mal a veces"¿un oxímoron? -

Traté de contestar. La pregunta carece de muchos detalles ... ¿Debería ser válida esa cadena? ¿El patrón realmente representa cadenas válidas / inválidas? ¿Cuáles son otras posibles entradas y salidas? -

@NullUserException: Para nada; transmite exactamente lo que significa transmitir. Aunque [A-Z] podría funcionar bien para un conjunto de datos y una intención en particular, siempre hay un conjunto de datos diferente en el que no cumple con la misma intención. A veces funciona y otras no. Siempre hay una situación en la que falla. Entonces, incluso si parece funcionar aquí y ahora, es solo por accidente y no se puede contar. Por lo tanto, a la larga, siempre está mal, incluso si eso siempre es solo a veces. ¿Ver? -

1 Respuestas

La expresión regular se está cayendo Retroceso catastrófico, que es la razón por la que aparece este error. Tenga en cuenta que su cadena no coincide con el patrón, ya que el patrón no permite dos guiones: --.

Pude simplificar el patrón para:

/^\w(?:-?\s*\w)*$/

Si hice esto bien, este patrón solo permite una forma de hacer coincidir cada cadena, por lo que no debería sufrir el mismo problema.
Si no necesita tales restricciones, puede simplificar enormemente el patrón, por ejemplo, para /^[\w\s\-]*$/.
Tenga en cuenta que \w también coincide con guiones bajos, pero debería ser fácil de corregir si es necesario.

Respondido 27 ago 11, 19:08

Hmm ... me estoy perdiendo a - b. Pensaré en ese. creo /^\w(?:(?:\s*-)?\s*\w)*$/ debería ser lo suficientemente bueno. De todos modos, volveré en unas horas. - Kobi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.