Olá!
Segue minha resolução:
- Classe senha que contém o método para validar a senha e a confirmação. Inclui uma etapa a mais na expressão regex que não aceita o mesmo caractere duas vezes consecutivas. Além disso, inclui um método para confirmação de senha, muito comum ao cadastrarmos senhas em sites e aplicativos:
package br.com.alura.exercicios;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Senha {
private String senha;
private String confirmacao;
public void setSenha(String senha) {
this.senha = senha;
}
public void setConfirmacao(String confirmaSenha) {
this.confirmacao = confirmaSenha;
}
private static final Pattern PATTERN = Pattern.compile("^(?=.*\\d)" +
"(?=.*[a-z])(?=.*[A-Z])" +
"(?=.*[$*&@#])(?:" +
"([0-9a-zA-Z$*&@#])" +
"(?!\\1)){8,}$");
public static boolean validarSenha(String senha){
Matcher matcher = PATTERN.matcher(senha);
return matcher.matches();
}
public static boolean confirmaSenha(String senha, String confirmacao){
return senha.equals(confirmacao);
}
}
- Main para rodar a aplicação:
package br.com.alura.exercicios;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Senha senha = new Senha();
String valor = "";
while (true){
System.out.println("Digite a senha: ");
valor = sc.nextLine();
senha.setSenha(valor);
if (!Senha.validarSenha(valor)){
System.out.println("Senha inválida! Tente novamente: ");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Senha válida!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
}
while (true){
System.out.println("Favor confirmar a senha: ");
String confirma = sc.nextLine();
senha.setConfirmacao(confirma);
if (!Senha.confirmaSenha(valor, confirma)){
System.out.println("As senhas são diferentes! Tente novamente: ");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Senha confirmada!");
break;
}
}
}
}
- Tomei a liberdade de incluir um delay de 1 segundo entre cada scanner para facilitar a visualização de cada etapa da aplicação.