2010-01-11 10 views
6

Ho bisogno il seguente controllo di una forte convalida della password:Forte password di espressione regolare che corrisponde a qualsiasi carattere speciale

  • Almeno 7 caratteri
  • Almeno 1 maiuscolo char (AZ)
  • Almeno 1 numero (0-9)
  • almeno un carattere speciale

ho trovato e ottimizzato un RegEx ed è come questo (mi dispiace, ho perso il riferimento ...):

^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@'#.$;%^&+=!""()*,-/:<>?]).*$ 

sta funzionando in C# tranne per il fatto che ho bisogno di adattarsi a qualsiasi carattere speciale, e voglio dire QUALSIASI. In altre parole, ho bisogno che il "carattere speciale" sia qualsiasi numero ma numeri e lettere maiuscole/minuscole.

Edit:

Per motivi di chiarezza, consideriamo che gli accenti sono caratteri speciali, quindi é, ñ e simili dovrebbero essere considerati i caratteri speciali nel contesto di questa domanda.

+10

Personalmente non userei un'espressione regolare per questo, perché è facile da interrompere e offusca le regole effettive per la convalida. Perché preoccuparsi? Basta scrivere 4 semplici test di corrispondenza delle stringhe. – Triptych

+0

Proverò il metodo di corrispondenza delle stringhe! – BrunoSalvino

+4

Le tue regole limitano la scelta dei caratteri da parte dell'utente e invece di contribuire a rendere la password più sicura lo rendono meno. Perché mi costringesti a usare le lettere latine solo per la mia password? –

risposta

8
^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).*$ 
+0

'[^ a-zA-Z0-9]' corrisponderà a 'é': non è un carattere davvero speciale ... :) –

+3

Ha detto" tutto tranne i numeri e le lettere maiuscole/maiuscole ", credo sia qualificato. –

+2

Penso che Bart stia cercando di dire che '[^ a-zA-Z0-9]' dovrebbe corrispondere a qualsiasi carattere che * non sia una lettera *, ma corrisponderà a 'é' che sicuramente * è * una lettera (I crediamo che tratterà altre lettere "internazionali" come å, ñ e così via, che in realtà non dovrebbe) –

4

credo che: -

\ w

corrisponde a qualsiasi carattere di parola.

L'inverso è: -

\ W

che è ciò che si desidera.

Modifica

^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).*$ 

prova le espressioni regolari a: -

http://www.nregex.com/nregex/default.aspx

+1

Errore per il trattino basso. –

+0

Bello, Yuriy. Modificato. –

1

dare uno sguardo qui: Unicode Regular Expressions e raccogliere una classe di Unicode, come \p{Symbol} o \p{Punctuation}

+0

Sì, '\ p {Punteggiatura}' e '\ p {Simbolo}' è quello che farei. +1 –

0

Prova questo:

^(?=.{7,})(?=.*?\d)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[@'#.$;%^&+=!"()*,-/:<>?]) 
5

(Non codice C#)

def validate (value): 
    return (value.Length >= 7 && 
      value.IndexOfAny(['0', ..., '9']) >= 0 && 
      value.IndexOfAny(['A', ..., 'Z']) >= 0 && 
      value.IndexOfAny(['@', ..., ')'])); 

Sì So che questo non è ciò che la questione richiede, ma credo che sia molto più chiaro, avere prestazioni più elevate e più facile da gestire rispetto qualsiasi soluzione RegExp.

+0

Anche a me piace questo. +1. –

+0

Questo migliora davvero la leggibilità. – BrunoSalvino

Problemi correlati