2015-05-30 8 views
5

Per quanto ne so {} parentesi graffe vengono utilizzati per limitare i caratteri in espressioni regolari come {3,12}, sarebbe partita la lunghezza carattere tra 3 a 12.come limitare, caratteri tra un intervallo utilizzando un'espressione regolare

sto cercando di convalidare il nome utente che potrebbe contenere un periodo . o _ o uno, ma non entrambi, non importa il posizionamento. Per questo sotto regex sta funzionando molto bene.

(^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$) 

Ma ho anche bisogno di limitare la lunghezza della stringa tra i 3 ei 12 anni, avevo cercato di mettere in {3,12} espressione regolare, ma che non funziona.

((^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$)){3,12} 

vedere Esempio: https://regex101.com/r/kN3aO1/1

+0

Molto seguito con l'espressione selezionata '^ (? =. {3,12} $) [a-z0-9] + (?: [._] [a-z0-9] +)? $ "A parte il lookahead per la lunghezza del valdate, vedi le altre sottili differenze dalla tua espressione regolare? – sln

+0

Avevo usato '|' per differenziare la stringa con non punto o underscore e viceversa lato diverso, come mai penso che l'espressione di hwnd sia migliore delle mine come non ha usato o –

risposta

3

Come hwnd suggerito, una soluzione più semplice potrebbe essere:

^(?=.{3,12}$)[a-z0-9]+(?:[._][a-z0-9]+)?$ 

vecchia soluzione, che è piuttosto complessa e complicata, è lasciato qui per riferimento , ma usa quello sopra invece.

^(?!(?:.{13,}|.{1,2})$)(?:([a-z0-9]+)|([a-z0-9]*[\.\_][a-z0-9]*))$ 

È possibile aggiungere un lookahead per questo.

Demo on regex101

+2

Probabilmente farei '^ (? =. { 3,12} $) [a-z0-9] + (?: [._] [a-z0-9] +)? $ 'Invece. – hwnd

+0

@hwnd yeah ..........appena usato regex di OP – vks

+1

Funziona come un incantesimo! Grazie –

0

Vorrei farlo in tre fasi.

  1. Verificare se la stringa ha un '/' in esso.
  2. Verificare se nella stringa è presente un '_'.
  3. Verificare se la lunghezza della stringa è compreso tra 3 e 12.

In Perl:

if ((($name =~ /_/) && ($name =~ /\./)) || 
    (length($name) < 3) || 
    (length($name) > 12)) 
{ 
    # Handle invalid username 
} 

Se si vuole fare in modo che il nome utente contiene un solo punto o di sottolineatura , puoi contarli. Ancora, in Perl:

my $dcnt = $name =~ tr /././; 
my $ucnt = $name =~ tr /_/_/; 

if (($dcnt > 0 && $ucnt > 0) || 
    ($dcnt > 1)   || 
    ($ucnt > 1)   || 
    (length($name) < 3) || 
    (length($name) > 12)) 
{ 
    # Handle invalid username 
} 

Perché non un'espressione regolare di mostri che fa tutto contemporaneamente? Bene, per ragioni di manutenibilità. Se tu o un collega guardate questo codice tra un anno, quando i requisiti sono cambiati, questo approccio renderà più semplice l'aggiornamento del codice.

Si noti inoltre che {3,12} non dice nulla sulle lunghezze. Consente al pattern precedente di corrispondere da tre a dodici volte.

Problemi correlati