Expressões regulares em Java: guia completo com exemplos de código
Expressões regulares (regex) são uma ferramenta poderosa para buscar, extrair e substituir texto por padrão. Em Java, o trabalho com expressões regulares é implementado através de duas classes principais: java.util.regex.Pattern (compilação do padrão) e java.util.regex.Matcher (execução da busca). Neste artigo, vamos analisar a sintaxe, os métodos principais e ver exemplos práticos que ajudarão você a usar regex com confiança em projetos reais.
1. Fundamentos do trabalho com expressões regulares em Java
Antes de passar aos exemplos, vamos analisar as classes-chave e sua interação.
Classe Pattern
Pattern é a representação compilada de uma expressão regular. Ela é criada pelo método estático Pattern.compile(). Sem compilação, não é possível usar regex.
Classe Matcher
Matcher é o "motor" que executa a busca pelo padrão especificado em uma string. É criado pelo método pattern.matcher(inputString).
Sintaxe básica de metacaracteres
.— qualquer caractere (exceto quebra de linha)\\d— dígito (0-9)\\w— letra, dígito ou sublinhado\\s— caractere de espaço em branco^— início da string$— fim da string*— 0 ou mais repetições+— 1 ou mais repetições?— 0 ou 1 repetição{n,m}— de n a m repetições[]— conjunto de caracteres (por exemplo,[a-z]— qualquer letra minúscula)()— grupo de captura
Exemplo 1: Verificação simples de número de telefone
import java.util.regex.*;
public class PhoneValidator { public static void main(String[] args) { String phone = "+7 (999) 123-45-67"; String regex = "^\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(phone); if (matcher.matches()) { System.out.println("Número válido"); } else { System.out.println("Número não corresponde ao formato"); } }}2. Métodos do Matcher: matches(), find() e grupo de captura
Entender a diferença entre matches() e find() é a chave para trabalhar com regex em Java com sucesso.
matches()— verifica se toda a string corresponde ao padrão por completo (adiciona implicitamente^e$).find()— busca uma substring que corresponda ao padrão em qualquer lugar da string.group()— retorna a correspondência encontrada ou o valor do grupo de captura.
Exemplo 2: Extração de endereços de email de um texto usando find() e grupos
import java.util.regex.*;
public class EmailExtractor { public static void main(String[] args) { String text = "Contatos: support@example.com, info@test.org e admin@site.net."; String regex = "([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\\\\.([a-zA-Z]{2,})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("Email completo: " + matcher.group()); System.out.println("Nome de usuário: " + matcher.group(1)); System.out.println("Domínio: " + matcher.group(2)); System.out.println("Zona: " + matcher.group(3)); System.out.println("---"); } }}Exemplo 3: Validação de senha com matches()
Requisitos: de 8 a 20 caracteres, pelo menos uma letra maiúscula, pe