2015-02-08 12 views
5

Sto cercando di creare un regex per convalidare i nomi utente, che deve corrispondere al seguente:Regex per abbinare un nome utente

  • solo un carattere speciale (._-) permesso e non deve essere al Extremas della stringa
  • il primo carattere non può essere un numero
  • Tutti gli altri caratteri consentiti sono lettere e numeri
  • la lunghezza totale dovrebbe essere tra 3 e 20 caratteri

Questo è per un modello di convalida HTML5, quindi purtroppo deve essere una grande espressione regolare.

Finora questo è quello che ho:

^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20} 

Ma il lookahead positivo può essere ripetuta più di una volta permette di essere più di un carattere speciale che non è quello che volevo. E non so come correggerlo.

+0

Non ancora una risposta - ma è necessario rompere '.' in' [._-] '. – amit

+0

Per qualcosa di così complicato, perché stai scegliendo un modello di convalida html? È possibile attivare un evento che gestisce la convalida anziché il modello. – Eclecticist

+0

@amit [._-] è un singolo carattere nella lista "._-" letteralmente così il punto non è considerato alcun carattere, quindi penso di non aver bisogno di romperlo – Tofandel

risposta

14

Si dovrebbe dividere il regex in due parti per rendere il vostro vivere più facile (non due espressioni!):

In primo luogo, in base al formato del nome utente deve avere: ^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

Ora, abbiamo solo bisogno di convalidare il vincolo di lunghezza. Al fine di non pasticciare arround con il modello già trovato, è possibile utilizzare un match non consumano che convalida solo il numero di caratteri (il suo letteralmente un hack per la creazione di un modello di e per l'espressione regolare): (?=^.{3,20}$)

Il regex cercherà solo di abbinare il formato valido se il vincolo di lunghezza è abbinato. È non-consumo, quindi dopo che ha avuto successo, il motore è ancora all'inizio della stringa.

così, tutti insieme:

(?=^.{3,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$ 

Regular expression visualization

Debuggex Demo

+1

Grazie maestro della regex, funziona (ho appena dovuto sostituire l'ultimo * con un +, quindi un carattere speciale non può essere alla fine – Tofandel

+1

@ Adri1du40 lo ha notato anche. (E già risolto) – dognose

0

Penso che sia necessario utilizzare ? anziché +, in modo che il carattere speciale sia abbinato una sola volta o meno.

^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}

+0

Ciò consentirebbe solo un carattere speciale essere all'inizio della stringa – Tofandel

+0

@ Adri1du40 Sei sicuro? Penso che '?' Sia fondamentalmente '+' eccetto che è abbinato solo a zero volte o una volta. –

+0

Sì, questo è ciò che '?' ma se lasci che un personaggio sia zero volte prima del carattere speciale, allora un carattere speciale può essere all'inizio – Tofandel