Expressões Regulares em Go com Exemplos: Na Prática
Expressões regulares (regex) são uma ferramenta poderosa para buscar, extrair e substituir texto com base em padrões. Em Go (Golang), o pacote padrão regexp é usado para trabalhar com elas, fornecendo uma API eficiente e segura. Neste artigo, exploraremos os principais recursos do pacote com exemplos concretos que ajudarão você a aplicar o conhecimento imediatamente em projetos reais.
Fundamentos do pacote regexp em Go
O pacote regexp implementa a sintaxe de expressões regulares compatível com RE2 (exceto por referências inversas e lookahead/lookbehind). Isso o torna rápido e previsível. As principais funções são:
regexp.Compile(pattern)— compila um padrão em um objetoRegexp. Retorna um erro se o padrão for inválido.regexp.MustCompile(pattern)— faz o mesmo, mas causa pânico em caso de erro. Conveniente para padrões estáticos.MatchString(pattern, s)— verifica se a stringscontém uma substring que corresponde ao padrão.
Sempre use Compile para padrões dinâmicos (por exemplo, de entrada do usuário) e MustCompile para padrões fixos no código.
package main
import ( "fmt" "regexp")
func main() { // Usamos MustCompile para um padrão estático re := regexp.MustCompile(`hello`) match := re.MatchString("hello world") fmt.Println(match) // true
// Compile para um padrão dinâmico pattern := "[0-9]+" re2, err := regexp.Compile(pattern) if err != nil { fmt.Println("Erro de compilação:", err) return } fmt.Println(re2.MatchString("abc123")) // true}Busca e Extração de Dados
Frequentemente, não basta apenas verificar uma correspondência; é necessário extrair partes específicas da string. Para isso, usamos os métodos FindString, FindStringSubmatch e FindAllString.
Extraindo a primeira correspondência
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\d+`) text := "Código: 12345, preço: 678" // Primeira correspondência first := re.FindString(text) fmt.Println(first) // 12345 // Todas as correspondências all := re.FindAllString(text, -1) fmt.Println(all) // [12345 678]}Extraindo grupos (submatches)
Grupos no padrão (indicados por parênteses) permitem extrair partes da correspondência. O método FindStringSubmatch retorna um slice onde o primeiro elemento é a correspondência completa e os seguintes são os valores dos grupos.
package main
import ( "fmt" "regexp")
func main() { // Padrão: nome de usuário @domínio re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`) email := "user@example.com" match := re.FindStringSubmatch(email) if len(match) > 0 { fmt.Println("Email completo:", match[0]) // user@example.com fmt.Println("Nome de usuário:", match[1]) // user fmt.Println("Domínio:", match[2]) // example.com }}O método FindAllStringSubmatch faz o mesmo para todas as correspondências na string.
Substituição de Texto com Expressões Regulares
O pacote regexp fornece dois métodos para substituição: ReplaceAllString (substituição simples) e ReplaceAllStringFunc (substituição usando uma função).
Substituição simples
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\s+`) // um ou mais espaços text := "Hello World Go" result := re.ReplaceAllString(text, " ") fmt.Println(result) // Hello World Go}Substituição usando grupos
Na string de substituição, você pode refer