Expressões Regulares em Java: da Teoria à Prática
\nExpressões regulares (regex) são uma ferramenta poderosa para busca, substituição e validação de texto. Em Java, o trabalho com elas é implementado através do pacote java.util.regex, que inclui duas classes principais: Pattern (padrão) e Matcher (correspondente). Neste artigo, vamos analisar a sintaxe, os métodos principais e consolidar o conhecimento com exemplos reais de código.
O material será útil tanto para iniciantes que estão conhecendo Java, quanto para desenvolvedores experientes que desejam revisar o assunto. Todos os exemplos podem ser executados diretamente na sua IDE.
\n\n1. Fundamentos do Trabalho com Pattern e Matcher
\nQualquer trabalho com regex em Java começa com a compilação do padrão através de Pattern.compile(). Depois disso, é criado um objeto Matcher, que aplica o padrão à string.
Vamos considerar um exemplo simples: encontrar todos os dígitos em um texto.
\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class RegexDemo {\n public static void main(String[] args) {\n String text = "Java versão 21 foi lançada em 2023";\n String regex = "\\\\d+"; // um ou mais dígitos\n\n Pattern pattern = Pattern.compile(regex);\n Matcher matcher = pattern.matcher(text);\n\n while (matcher.find()) {\n System.out.println("Encontrado: " + matcher.group());\n }\n }\n}\nSaída do programa:
\nEncontrado: 21\nEncontrado: 2023\nObserve a barra invertida dupla \\\\d — em Java, o literal de string requer o escape da barra invertida. Se no regex for necessário especificar \\d, no código escrevemos \\\\d.
2. Sintaxe das Expressões Regulares: Metacaracteres e Quantificadores
\nPara usar regex de forma eficaz, é importante memorizar os principais metacaracteres:
\n- \n
.— qualquer caractere (exceto quebra de linha); \n \\\\d— dígito (equivalente a[0-9]); \n \\\\w— letra, dígito ou sublinhado ([a-zA-Z0-9_]); \n \\\\s— caractere de espaço em branco; \n ^— início da string; \n $— final da string. \n
Os quantificadores controlam a quantidade de repetições:
\n- \n
+— uma ou mais vezes; \n *— zero ou mais vezes; \n ?— zero ou uma vez; \n {n}— exatamente n vezes; \n {n,m}— de n a m vezes. \n
Exemplo: vamos encontrar todas as palavras compostas apenas por letras latinas, com comprimento de 3 a 5 caracteres.
\nString text = "Java regex example for beginners";\nString regex = "\\\\b[a-zA-Z]{3,5}\\\\b";\n\nPattern pattern = Pattern.compile(regex);\nMatcher matcher = pattern.matcher(text);\n\nwhile (matcher.find()) {\n System.out.println(matcher.group());\n}\n// Saída: Java, regex, for\nO limite de palavra \\\\b impede correspondências parciais (por exemplo, "Java" não será parte de "JavaScript").
3. Exemplos Práticos: Validação e Extração de Dados
\nVamos passar para tarefas que são frequentemente encontradas no desenvolvimento real.
\n\n3.1. Validação de Endereço de Email
\nVerificação simples: presença do caractere "@" e do domínio.
\npublic static boolean isValidEmail(String email) {\n String regex = "^[\\\\w.-]+@[\\\\w.-]+\\\\.\\\\w{2,}$";\n return Pattern.matches(regex, email);\n}\n\npublic static void main(String[] args) {\n System.out.println(isValidEmail("user@example.com")); // true\n System.out.println(isValidEmail("invalid-email")); // false\n}\nO método Pattern.matches() verifica automaticamente a string inteira (equivalente a matcher.matches()).
3.2. Extração de Números de Telefone
\nSuponha que no texto apareçam números no formato "+7 (999) 123-45-67".
\nString text = "Contato: +