DEV Community

Cover image for Expressões Regulares (Regex) — História, Conceitos e Java na Prática
Kauê Matos
Kauê Matos

Posted on

Expressões Regulares (Regex) — História, Conceitos e Java na Prática

O que São Expressões Regulares?

Expressões regulares, ou simplesmente regex, são padrões utilizados para encontrar, validar ou substituir textos dentro de outras strings.

Imagine querer achar todos os e-mails num texto, ou validar se um CEP foi digitado corretamente. Regex permite fazer isso em uma única linha de código, algo que seria bem mais trabalhoso com verificações manuais.

Breve História das Expressões Regulares

A história das expressões regulares é fascinante e está ligada à matemática e à ciência da computação:

  • 1951 — O matemático norte-americano Stephen Kleene introduz o conceito de “expressões regulares” enquanto estudava automatos finitos e linguagens formais.
  • 1968 — Ken Thompson implementa regex pela primeira vez em software, no editor QED para o sistema operacional CTSS, um antecessor do Unix.
  • 1970s — Regex passa a integrar o Unix, em ferramentas como ed, sed, grep e awk.
  • Décadas seguintes — Regex se espalha para quase todas as linguagens de programação, inclusive Java, PHP, Python, Perl e muitas outras.

Curiosidade: A sigla regex também é chamada de regexp (regular expression) ou RE.

Para Que Serve Regex?

  • Validação

    • E-mail, CPF, telefone, datas, etc.
  • Busca

    • Encontrar palavras-chave, padrões ou formatos específicos em textos.
  • Substituição

    • Trocar pedaços do texto por outros (ex.: remover espaços extras).
  • Extração

    • Pegar apenas partes específicas de uma string (como o domínio de um e-mail).

🧩 Como Usar Regex no Java

No Java, regex está no pacote:

import java.util.regex.*;
Enter fullscreen mode Exit fullscreen mode

Principais classes:

Classe Função
Pattern Armazena o padrão regex compilado
Matcher Permite procurar o padrão em uma string

Exemplos Simples em Java

Procurando uma palavra em um texto

import java.util.regex.*;

public class RegexDemo {
    public static void main(String[] args) {
        String texto = "Hoje é sexta-feira!";
        String regex = "sexta";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(texto);

        if (matcher.find()) {
            System.out.println("Encontrei a palavra: " + matcher.group());
        } else {
            System.out.println("Não encontrei a palavra.");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Saída:

Encontrei a palavra: sexta
Enter fullscreen mode Exit fullscreen mode

🔣 Símbolos Essenciais em Regex

Vamos entender agora os símbolos especiais de regex, com exemplos em Java para cada um.

. → Qualquer caractere (menos \n)

String texto = "casa";
System.out.println(texto.matches("c.s.")); // true (casa)
Enter fullscreen mode Exit fullscreen mode

* → Zero ou mais ocorrências

String texto = "aaab";
System.out.println(texto.matches("a*b")); // true
Enter fullscreen mode Exit fullscreen mode
  • Casa com:

    • "b"
    • "ab"
    • "aaab"

+ → Uma ou mais ocorrências

String texto = "aaab";
System.out.println(texto.matches("a+b")); // true
Enter fullscreen mode Exit fullscreen mode
  • Não casa com “b” sozinho.

? → Zero ou uma ocorrência

String texto = "color";
System.out.println(texto.matches("colou?r")); // true
Enter fullscreen mode Exit fullscreen mode
  • Casa com “color” ou “colour”.

^ → Início da string

String texto = "Bom dia!";
System.out.println(texto.matches("^Bom.*")); // true
Enter fullscreen mode Exit fullscreen mode

$ → Fim da string

String texto = "Documento.pdf";
System.out.println(texto.matches(".*\\.pdf$")); // true
Enter fullscreen mode Exit fullscreen mode

[] → Conjunto de caracteres

String texto = "casa";
System.out.println(texto.matches("c[aeiou]sa")); // true
Enter fullscreen mode Exit fullscreen mode
  • Casa com “casa”, “cesa”, “cisa” etc.

[^] → Negação

String texto = "c1sa";
System.out.println(texto.matches("c[^aeiou]sa")); // true
Enter fullscreen mode Exit fullscreen mode
  • O segundo caractere não pode ser vogal.

{n} → Exatamente n ocorrências

String texto = "aaa";
System.out.println(texto.matches("a{3}")); // true
Enter fullscreen mode Exit fullscreen mode

{n,} → Pelo menos n ocorrências

String texto = "aaaa";
System.out.println(texto.matches("a{2,}")); // true
Enter fullscreen mode Exit fullscreen mode

{n,m} → Entre n e m ocorrências

String texto = "aaa";
System.out.println(texto.matches("a{2,4}")); // true
Enter fullscreen mode Exit fullscreen mode

\\d → Dígito (equivale a [0-9])

String texto = "5";
System.out.println(texto.matches("\\d")); // true
Enter fullscreen mode Exit fullscreen mode

\\w → Letra, dígito ou underscore

String texto = "Java_9";
System.out.println(texto.matches("\\w+")); // true
Enter fullscreen mode Exit fullscreen mode

\\s → Espaço em branco (tab, espaço, quebra de linha)

Agrupamento com ()

Capturar partes específicas:

String texto = "Dia 15/08/2025";
String regex = "Dia (\\d{2})/(\\d{2})/(\\d{4})";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(texto);

if (matcher.find()) {
    System.out.println("Dia: " + matcher.group(1));
    System.out.println("Mês: " + matcher.group(2));
    System.out.println("Ano: " + matcher.group(3));
}
Enter fullscreen mode Exit fullscreen mode

Saída:

Dia: 15
Mês: 08
Ano: 2025
Enter fullscreen mode Exit fullscreen mode

🧪 Exemplos Práticos de Regex em Java

1. Validar E-mail

String email = "teste@email.com";
String regex = "\\w+@\\w+\\.\\w+";

System.out.println(email.matches(regex)); // true
Enter fullscreen mode Exit fullscreen mode

2. Verificar CPF

String cpf = "123.456.789-00";
String regex = "\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}";

System.out.println(cpf.matches(regex)); // true
Enter fullscreen mode Exit fullscreen mode

3. Extrair domínios de e-mails

String texto = "Meu email é teste@email.com";
String regex = "@(\\w+\\.\\w+)";

Matcher m = Pattern.compile(regex).matcher(texto);
if (m.find()) {
    System.out.println("Domínio: " + m.group(1));
}
Enter fullscreen mode Exit fullscreen mode

Saída:

Domínio: email.com
Enter fullscreen mode Exit fullscreen mode

4. Substituir espaços múltiplos por apenas um

String texto = "Nome    Sobrenome";
texto = texto.replaceAll("\\s+", " ");
System.out.println(texto);
Enter fullscreen mode Exit fullscreen mode

Saída:

Nome Sobrenome
Enter fullscreen mode Exit fullscreen mode

Dicas Avançadas

Prefira Pattern e Matcher para buscas complexas ou múltiplas ocorrências.

Em Java, lembre-se sempre que precisa escapar a barra invertida\ vira \\ na string.

Para ler múltiplas ocorrências num texto:

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("Temos 15 laranjas e 32 maçãs.");
while (m.find()) {
    System.out.println("Número encontrado: " + m.group());
}
Enter fullscreen mode Exit fullscreen mode

Saída:

Número encontrado: 15
Número encontrado: 32
Enter fullscreen mode Exit fullscreen mode

Conclusão

Regex é um superpoder. Se usado com cuidado, economiza centenas de linhas de código ao buscar, extrair ou validar padrões. No Java, a API java.util.regex oferece tudo o que você precisa para manipular textos com eficiência.

Top comments (0)