Originariamente inviato da mokup
Le stringhe devono essere composta da lettere minuscole (almeno 1) e maiuscole (almeno 1),
da numeri (almeno 1) e opzionalmente dai seguenti caratteri speciali @!#$%
Generalmente quando si hanno criteri del tipo "almeno n caratteri X e almeno m caratteri Y ecc..." le cose si complicano notevolmente e, al limite, non sono nemmeno realizzabili usando le espressioni regolari.
Nel tuo caso si può fare con le regex e l'uso dei "lookahead" in effetti aiuta. Ma c'è la questione dei caratteri opzionali.
Io farei così: i lookahead verificano i criteri stretti "almeno 1 carattere X" mentre con il quantificatore {6,20} potresti controllare che la sequenza si fatta solo dai caratteri "possibili" che comprendono sia quelli richiesti che quelli opzionali. Non accettando quindi altro.
Provando questo:
codice:
public class Prova {
public static void main(String[] args) {
String p = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[\\da-zA-Z@!#$%]{6,20}";
System.out.println("Qwerty1!".matches(p));
System.out.println("qWerty1!".matches(p));
System.out.println("1qWeRtY".matches(p));
System.out.println("Qwerty1+".matches(p));
System.out.println("Qwerty1-".matches(p));
}
}
Mi pare che funzioni come volevi. Potrebbe sembrare una ripetizione la classe finale [ ... ] con il quantificatore {6,20} ma in realtà come ho detto sopra serve per indicare ciò che è possibile .... non il criterio "almeno 1 ...".
Altre soluzioni ora non mi vengono in mente.