Expressão regular para senhas fortes

4 respostas
B

Olá,

Preciso de uma expressão regular que valide Senhas fortes com 1 letra maiúscula, 2 letras minusculas, 2 números, um caracter especial e pelo menos 8 caracter

Tenho o seguinte método java que recebe uma String qualquer só que o meu problema está na expressão regular passada na constante abaixo

public static boolean validaPassword(final String password) {
    Pattern p = Pattern.compile(EXPRESSAO_REGULAR_SENHA_FORTE);
    Matcher m = p.matcher(password);
return m.matches();
}
  1. A seguinte expressão regular só valida se for dois números juntos por exemplo P25tlhm$ (Valída) e P2tl5hm$ (Inválida)

^(?=.[0-9]{2,})(?=.[a-z]{2,})(?=.[A-Z])(?=.[@#$%^&+=])(?=\S+$).{8,}$

  1. A seguinte expressão regular não considera 2 letras minusculas e 2 números

^.(?=.{8,})((?=.\d)(?=.[a-z]){2,})((?=.[a-z]){2,})(?=.[A-Z])(?=.[@#$%^&+=]).*$

  1. A seguinte expressão só verifica se tem 2 números e 2 letras, mas não estou conseguindo juntar com alguma das expressão acima

Expressao com no minimo 2 letras minusculas e 2 numeros

^(?=[a-z](?:\d[a-z]){2,}$)(?=\d*(?:[a-z]\d*){2,}$).*

Alguém poderia me ajudar por favor???

4 Respostas

E

Eu já vi esse problema hoje à tarde…

Se você vai usar uma rotina, ou seja, não tem limitação da quantidade de expressões regulares que podem ser usadas, use várias expressões regulares em vez de apenas uma mega-ultra-blaster-expressão-regular-dos-infernos.

E

Obviamente você precisa alterar essas expressões regulares, porque você quer que haja pelo menos 2 letras minúsculas. Troque:

// Criterio 3: Senha contém letras minúsculas  
    Pattern p3 = Pattern.compile ("[a-z]");

por

// Criterio 3: Senha contém pelo menos 2 letras minúsculas  
    Pattern p3 = Pattern.compile ("[a-z].*[a-z]");
    if ( ! p3.matcher (senha).find()) return false;

e assim por diante.

B

Obrigado a todos, e valew pela dica entanglement, através dela eu consegui resolver e para os que precisarem ficou assim:

private final static String EXPRESSAO_REGULAR_SENHA_FORTE = "^(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$";
E

Interessante o uso de (?=). Vou pôr isso na minha caixa de ferramentas :slight_smile:

Para quem quiser entender o que o Bruno fez.

Ele queria bater com várias expressões regulares de uma vez só. Então ele especificou cada uma separadamente, e usou (?=) para juntá-las (como se fosse um AND lógico).

Criado 8 de março de 2013
Ultima resposta 8 de mar. de 2013
Respostas 4
Participantes 2