2013-03-13 10 views
5

Próbuję utworzyć dopasowanie do wyrażenia regularnego (dla haseł), gdzie ciąg musi zawierać od 8 do 30 znaków, musi mieć co najmniej 2 cyfry, co najmniej 2 litery (bez rozróżniania wielkości znaków), co najmniej 1 znak specjalny i brak spacji.Regex, aby dopasować co najmniej 2 cyfry, 2 litery w dowolnej kolejności w ciągu znaków

Mam działające spacje i znaki specjalne, ale otrzymuję 2 cyfry i 2 litery, ponieważ nie muszą być kolejne.

tj. Powinien pasować do a1b2c$ lub ab12$ lub 1aab2c$.

Coś takiego do listów?

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

Ciąg poniżej działa, ale tylko wtedy, gdy są rzędu 2 litery i cyfry 2 są consecutive..it zawiedzie jeśli litery, cyfry, znaki specjalne przeplatają.

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

Jesteś absolutnie pewien, trzeba regexp do tego? – Scorpil

+0

Chciałbym argumentować przeciwko regex i po prostu mieć indywidualne kontrole dla każdego z instrukcjami if i pewnego rodzaju funkcji string.contains(). gparyani dało rozwiązanie, które wydaje się być o wiele ładniejsze niż regex – user1751547

+0

Wygląda na to, że potrzebuję regex, ponieważ jest to część konfiguracji Liferay. – user2166893

Odpowiedz

5

Jeśli nie chcesz, aby litery były kolejno następujące, (?=.*[a-zA-Z].*[a-zA-Z]) to prawidłowe podejście. To samo dotyczy cyfr (?=.*\\d.*\\d) lub (?=(.*\\d){2}).

Spróbuj regex

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

Dzięki. To działa! Dokładnie to, czego szukałem. – user2166893

+0

Cieszę się, że mogę pomóc :) – Pshemo

0

i obserwować swoje przykłady, które świadczą nie są od 8 do 30 znaków

spróbować tego wzoru raz, jeśli chcesz 8-30 znaków

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

Twoje przypuszczenie byłoby dość dokładne. Można go wyglądać nieco bardziej elegancko z parens.

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

Wygląda na to, że jesteś na dobrej drodze.

3

Użyj pętli przemierzać ciągu:

/** 
* 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

Korzystanie z regex jest o wiele bardziej wydajne – Barnaby

Powiązane problemy