2011-11-23 24 views

Respuesta

9

Ya que menciona en el título, una búsqueda negativa hacia delante para su caso sería:

^(?!.{16,})(regex goes here)+$ 

Nota de la búsqueda negativa hacia delante al comienzo (?!.{16,}), que comprueba que la cadena no tiene 16 o mas personajes

Sin embargo, como @TimPietzcker ha señalado que su Regex puede simplificarse mucho y volverse a escribir en una forma que no sea propensa al retroceso, por lo que debe usar su solución.

+1

Esto sigue siendo terriblemente propenso a un retroceso catastrófico. No es una buena expresión regular. –

+0

@TimPietzcker Muy buen punto. Respuesta ahora actualizada, gracias –

5
^(?=.{15}$)([A-Z]+()*[A-Z]+)+$ 

See it

+0

Esta permite habilitar fácilmente la restricción de longitud de cadena mínima –

11

En realidad, todo esto se puede simplificar mucho:

^[A-Z][A-Z ]{0,13}[A-Z]$ 

hace exactamente lo que quiere. O al menos lo que hace su expresión regular actual (más la restricción de longitud). Esto evita especialmente los problemas con catastrophic backtrackin g que se está configurando para anidar cuantificadores como ese.

Caso en cuestión:

Tratar la cadena ABCDEFGHIJKLMNOP en contra de su expresión regular originales. El motor de expresiones regulares coincidirá instantáneamente. Ahora prueba la cadena ABCDEFGHIJKLMNOPa. Tomará el motor de expresiones regulares casi 230,000 pasos para descubrir que no puede coincidir con la cadena. Y cada personaje adicional dobla la cantidad de pasos necesarios para determinar una coincidencia fallida.

+0

Parece que requiere al menos 2 letras, una al principio, una al final. – sln

+0

La expresión regular que dio coincide con "A" y "A", ninguna de las cuales coincide con la expresión regular del póster. –

+0

No, este permitirá que la cadena termine en blanco. – AustinTX

Cuestiones relacionadas