2011-11-23 15 views

risposta

9

Dal momento che lei ha citato nel titolo, un lookahead negativo per il caso sarebbe:

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

Annotare il lookahead negativo all'inizio (?!.{16,}), che controlla che la stringa non ha 16 o più personaggi

Tuttavia, come @TimPietzcker ha sottolineato, il tuo Regex può essere semplificato molto e riscritto in un formato che non è incline al backtracking, quindi dovresti usare la sua soluzione.

+1

Questo è ancora orribilmente incline a un backtracking catastrofico. Non una buona espressione regolare. –

+0

@TimPietzcker Ottimo punto. Risposta ora aggiornata, grazie –

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

See it

+0

Questo abilita facilmente aggiungere una limitazione minima della lunghezza delle stringhe –

11

In realtà, tutto questo può essere semplificato molto:

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

fa esattamente quello che vuoi. O almeno quello che fa la tua espressione regolare (più la restrizione di lunghezza). Ciò evita in particolare i problemi con catastrophic backtrackin che ti stai preparando per quando si annidano i quantificatori in questo modo.

Caso in questione:

Prova la stringa ABCDEFGHIJKLMNOP contro la vostra regex originale. Il motore regex lo abbinerà all'istante. Ora prova la stringa ABCDEFGHIJKLMNOPa. Prenderà il motore regex quasi a 230,000 per capire che non può corrispondere alla stringa. E ogni carattere aggiuntivo raddoppia il numero di passaggi necessari per determinare una corrispondenza fallita.

+0

Il suo aspetto richiede almeno 2 lettere, una all'inizio e una alla fine. – sln

+0

L'espressione regolare delle corrispondenze "A" e "A", nessuna delle quali corrisponde all'espressione regolare del poster. –

+0

No, questo consentirà la stringa che termina con lo spazio bianco. – AustinTX

Problemi correlati