2013-03-13 23 views
5

Sto provando a creare un'espressione regolare per la corrispondenza del modello (per le password) in cui la stringa deve essere compresa tra 8 e 30 caratteri, deve avere almeno 2 cifre, almeno 2 lettere (maiuscole e minuscole), almeno un carattere speciale e nessuno spazio.Regex per abbinare almeno 2 cifre, 2 lettere in qualsiasi ordine in una stringa

Ho gli spazi e l'abbinamento di caratteri speciali funzionanti, ma vengono lanciati sulle 2 cifre e 2 lettere perché non è necessario che siano consecutive.

, ad esempio deve corrispondere a a1b2c$ o ab12$ o 1aab2c$.

Qualcosa come questo per le lettere?

(?=.*[a-zA-Z].*[a-zA-Z]) // Not sure. 

Questa stringa seguente funziona, ma solo se le 2 lettere sono consecutivi e le 2 numeri sono consecutive..it fallisce se le lettere, numeri, caratteri speciali sono intrecciati.

(?=^.{8,30}$)((?=.*\\d)(?=.*[A-Za-z]{2})(?=.*[0-9]{2})(?=.*[[email protected]#$%^&*?]{1})(?!.*[\\s]))^.* 
+5

Sei assolutamente sicuro che hai bisogno regexp per questo? – Scorpil

+0

Discuterei contro espressioni regolari e ho solo controlli individuali per ognuna con istruzioni if ​​e una sorta di funzione string.contains(). gparyani ha dato una soluzione che sembra essere molto più adatta rispetto alla regex – user1751547

+0

Sembra che ho bisogno di regex poiché questo fa parte di una configurazione Liferay. – user2166893

risposta

5

Se non si desidera che le lettere debbano essere consecutive, (?=.*[a-zA-Z].*[a-zA-Z]) è l'approccio corretto. Lo stesso vale per le cifre (?=.*\\d.*\\d) o (?=(.*\\d){2}).

Prova questo regex

(?=^.{8,30}$)(?=(.*\\d){2})(?=(.*[A-Za-z]){2})(?=.*[[email protected]#$%^&*?])(?!.*[\\s])^.* 
+1

Grazie. Funziona! Esattamente quello che stavo cercando. – user2166893

+0

Contento di poter aiutare :) – Pshemo

0

osservo i tuoi esempi che forniti non sono 8 a 30 caratteri

provare questo modello una volta, se si desidera 8-30 caratteri

(?=[^\s]*[^\sa-zA-Z0-9][^\s]*)(?=[^\s]*[a-zA-Z][^\s]*[A-Za-z][^\s]*)(?=[^\s]*\d[^\s]*\d[^\s]*)[^\s]{8,30} 
1

tua ipotesi è abbastanza preciso. Può essere fatto sembrare un po 'più elegante con i parents.

(?=(.*[a-zA-Z]){2}) 

Sembra che tu sia sulla strada giusta.

3

utilizzare un ciclo per attraversare la stringa:

/** 
* Checks to see if the specified string has between 8 and 30 characters, has at least 2 digits, at least 2 letters, at least one special character, and no spaces. 
* @param s the String to be checked 
* @return s, if it passes the above test 
* @throws IllegalArgumentException if it does not 
*/ 
public static String check(String s) 
{ 
    IllegalArgumentException invalid = new IllegalArgumentException(); 
    if(s.length() < 8 || s.length() > 30) 
     throw invalid; 
    int letters = 0, numbers = 0, specialChars = 0; 
    for(char c : s.toCharArray()) 
    { 
     if(c == ' ') 
      throw invalid; 
     else if(Character.isLetter(c)) 
      ++letters; 
     else if(Character.isDigit(c)) 
      ++numbers; 
     else 
      ++specialChars; 

    } 
    if(letters < 2 || numbers < 2 || specialChars < 1) 
     throw invalid; 
    return s; 
} 
+0

L'utilizzo di un'espressione regolare è molto più efficiente – Barnaby

Problemi correlati