Expressões Regulares em Go: análise completa com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Expressões Regulares em Go com exemplos: na prática

\n\n

Expressões regulares (regexp) são uma ferramenta poderosa para buscar, extrair e substituir texto com base em padrões. Em Go (Golang), o trabalho com regex é implementado através do pacote padrão regexp. Neste artigo, abordaremos as principais funções, a sintaxe e forneceremos exemplos práticos que ajudarão você a usar expressões regulares com confiança em seus projetos.

\n\n

Fundamentos do pacote regexp

\n\n

O pacote regexp oferece duas formas principais de compilar uma expressão regular:

\n\n
    \n
  • regexp.Compile(pattern string) (*Regexp, error) — compila o padrão e retorna um objeto Regexp ou um erro se o padrão for inválido.
  • \n
  • regexp.MustCompile(pattern string) *Regexp — faz o mesmo, mas gera panic em caso de erro. É útil para padrões estáticos definidos em tempo de inicialização.
  • \n
\n\n

Recomenda-se usar MustCompile para padrões que são garantidamente válidos (por exemplo, definidos no código) e Compile para padrões dinâmicos, obtidos do usuário ou de fontes externas.

\n\n

Exemplo 1: Busca de substring (FindString)

\n\n

A função FindString retorna a primeira correspondência com o padrão como uma string. Se não houver correspondências, retorna uma string vazia.

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "Meu email: exemplo@mail.com, reserva: teste@example.org"\n    pattern := `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}`\n\n    re := regexp.MustCompile(pattern)\n    match := re.FindString(text)\n\n    fmt.Println("Email encontrado:", match) // Saída: exemplo@mail.com\n}
\n\n

Exemplo 2: Busca de todas as correspondências (FindAllString)

\n\n

Se precisar encontrar todas as correspondências, use FindAllString. O segundo argumento é o número máximo de correspondências (-1 para todas).

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "Códigos: ABC-123, XYZ-456, QWE-789"\n    pattern := `[A-Z]{3}-\\d{3}`\n\n    re := regexp.MustCompile(pattern)\n    matches := re.FindAllString(text, -1)\n\n    fmt.Println("Códigos encontrados:", matches)\n    // Saída: [ABC-123 XYZ-456 QWE-789]\n}
\n\n

Exemplo 3: Substituição de texto (ReplaceAllString)

\n\n

ReplaceAllString substitui todas as correspondências do padrão pela string especificada. É possível usar grupos de captura com a sintaxe $1, $2, etc.

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "Data: 2024-01-15, outra data: 2023-12-31"\n    pattern := `(\\d{4})-(\\d{2})-(\\d{2})`\n\n    re := regexp.MustCompile(pattern)\n    // Mudando o formato de AAAA-MM-DD para DD.MM.AAAA\n    result := re.ReplaceAllString(text, "$3.$2.$1")\n\n    fmt.Println("Resultado:", result)\n    // Saída: Data: 15.01.2024, outra data: 31.12.2023\n}
\n\n

Exemplo 4: Verificação de correspondência de string com padrão (MatchString)

\n\n

A função MatchString retorna true se houver pelo menos uma correspondência com o padrão na string.

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    emails := []string{"usuario@example.com", "email-invalido", "admin@site.org"}\n    pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`\n\n    re := regexp.MustCompile(pattern)\n    for _, email := range emails {\n        if re.MatchString(email) {\n            fmt.Printf("'%s' — email válido\\n", email)\n        } else {\n            fmt.Printf("'%s' — email INVÁLIDO\\n", email)\n        }\n    }\n    // Saída:\n    // 'usuario@example.com' — email válido\n    // 'email-invalido' — email INVÁLIDO\n    // 'admin@site.org' — email válido\n}
\n\n

Exemplo 5: Extração de dados com grupos de captura (FindStringSubmatch)

\n\n

FindString

Blogs

Book Recommendations