2010-01-04 21 views
7

Sto cercando una regex piuttosto specifica e ce l'ho quasi ma non del tutto.Regex per password che richiede un carattere numerico o un carattere non alfanumerico

Voglio una regex che richiederà almeno 5 charactors, in cui almeno uno di questi personaggi è sia un valore numerico o un carattere non alfanumerico.

Questo è quello che ho finora:

^(?=.*[\d]|[[email protected]#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$ 

Quindi il problema è la "o" parte. Consentirà valori non alfanumerici, ma richiede comunque almeno un valore numerico. Puoi vedere che ho l'operatore o "|" tra i miei richiedo numeri e non alfanumerici, ma non sembra funzionare.

Qualsiasi suggerimento sarebbe ottimo.

+0

per un carattere non alfanumerico è possibile utilizzare \ W (non-parola personaggio, cioè nessuno di [a-zA-Z0-9_ ]) invece di [! @ # $% \^*() _ \ - + = \ [{\]} ;: | \ ./] –

risposta

19

Prova:

^(?=.*(\d|\W)).{5,20}$ 

Una breve spiegazione:

^       # match the beginning of the input 
(?=      # start positive look ahead 
    .*      # match any character except line breaks and repeat it zero or more times 
    (      # start capture group 1 
    \d     #  match a digit: [0-9] 
    |      #  OR 
    \W     #  match a non-word character: [^\w] 
)      # end capture group 1 
)       # end positive look ahead 
.{5,20}     # match any character except line breaks and repeat it between 5 and 20 times 
$       # match the end of the input 
+0

paura no ... che non richiede di avere un numero o un carattere non alfanumerico –

+0

Sì, sì. Immagino che non l'hai provato correttamente?Lo sguardo successivo richiede che la stringa contenga almeno una cifra o non parola. –

+2

... e se intendevi * "un numero ** e un carattere non alfanumerico" *, allora questo farà il trucco: '^ (? =. * \ D) (? =. * \ W) . {5,20} $ ' –

0

Che ne dici di questo?

^.*?[\[email protected]#$%\^*()_\-+=\[{\]};:|\./].*$ 

Per la lunghezza 5,20 Si prega di utilizzare la normale funzione strlen

+0

Che in realtà non funziona, come se si volesse un non-alfanumerico o carattere numerico all'inizio o alla fine, fallirà. Tuttavia, mi hai portato sulla strada giusta. –

+0

Hai davvero provato? Dovrebbe funzionare anche per caratteri non alfanumerici o numerici all'inizio o alla fine. – YOU

0

E 'davvero necessario per farcire tutto in una regex gigante? Basta usare la logica del programma (5 ≤ length(s) ≤ 20) ∧ (/[[:digit:]]/ ∨ /[^[:alpha:]]/). Molto più leggibile sintatticamente e semanticamente, penso.

+0

Utilizzo l'appartenenza ASP.NET dappertutto, dovrei tornare indietro e implementare quella logica in più posizioni insieme ad eccezioni, ecc. È più semplice usare Regex nella configurazione dell'appartenenza. Regex ha il suo posto come tutte le altre tecniche di programmazione. –

1

Forse questo può funzionare per voi:

^.*[\d\W]+.*$ 

E utilizzare un codice come questo per controllare la dimensione della stringa:

if(str.len >= 5 && str.len =< 20 && regex.ismatch(str, "^.*[\d\W]+.*$")) { ... } 
+0

Mi serve tutto in un'espressione regolare per il mio problema attuale. –

0

Abbastanza semplice soluzione, una volta mi ha S.Marco sulla strada giusta , avevo solo bisogno di unire i miei pezzi numerici e non alfanumerici come uno.

Ecco l'espressione regolare finale per tutti coloro che è interessato:

^(?=.*[\[email protected]#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$ 

Questo permetterà alcuna password tra 5 e 20 caratteri e richiede almeno una lettera e un numerica e/o di un carattere non alfanumerico.

Problemi correlati