2009-08-22 11 views
13

Qualcuno può aiutarmi a scrivere un'espressione regolare per verificare se una password contiene almeno una lettera e un numero?Espressione regolare per verificare se una determinata password contiene almeno un numero e una lettera in C#?

Ho un requisito che le password degli utenti devono essere alfanumeriche e voglio essere in grado di verificarlo utilizzando un'espressione regolare.

+0

Downvoted? Veramente? –

+10

@Paco: non ero a conoscenza del fatto che Stack Overflow consenta solo domande difficili! – LukeH

+0

Sono d'accordo con Luca. Stack Overflow non deve essere per il professionista esperto che ha un problema nel decodificare bytecode, o "dov'è la documentazione WMI". –

risposta

2
bool isValid = Regex.IsMatch(password, @"[a-zA-Z]") && 
       Regex.IsMatch(password, @"\d"); 
7

Se si vuole che in una regex è possibile utilizzare "[a-zA-Z].*\\d|\\d.*[a-zA-Z]" se due controlli separati può essere più leggibile.

Edit: un approccio con due controlli, che trovo abbastanza leggibile, potrebbe essere simile a questo:

Regex.IsMatch(password, "\\d") && Regex.IsMatch(password, "[a-zA-Z]") 
+0

E quindi è necessario un controllo extra per verificare se ha solo caratteri alfanumerici. –

21

lookahead positivo è quello che stai cercando. L'espressione regolare è simile al seguente:

(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+ 

Qui, (?=.*[A-Za-z]) è il lookahead positivo che afferma che la stringa come almeno un carattere e (?=.*[0-9]) afferma che esso ha almeno una cifra. È importante notare che il lookahead positivo non restituisce una corrispondenza, ma piuttosto afferma se esiste una corrispondenza o meno. Quindi, dovresti leggere la regex precedente come "asserire che ha almeno un carattere, asserire che ha almeno una cifra, ora che sappiamo che le asserzioni sono passate, basta controllare la presenza di caratteri alfanumerici".

Questo è molto interessante perché consente di combinare facilmente i requisiti di convalida dell'applicazione, senza rendere la regex molto complessa. Ad esempio, se si richiede ora la stringa di avere esattamente 20 caratteri, è solo bisogno di aggiungere una nuova asserzione lookahead positivo, in questo modo:

(?=[A-Za-z0-9]{20})(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+ 

Speranza che aiuta!

+0

perché non questo? (? =. * [A-Za-z]) (? =. * [0-9]) [A-Za-z0-9] {20} –

+0

Perché hai bisogno di '. *' Nel tuo lookahead positivo? Non capisco come il risultato sarebbe diverso se lo omessi. – xr280xr

Problemi correlati