Expressões Regulares em Go: uma ferramenta poderosa para trabalhar com texto
Expressões regulares (regex) são uma ferramenta indispensável para pesquisar, extrair e substituir texto com base em padrões. Na linguagem Go (Golang), o trabalho com expressões regulares é implementado através do pacote padrão regexp. Ele fornece uma maneira rápida e segura de trabalhar com padrões, usando uma sintaxe próxima ao Perl e RE2. Neste artigo, vamos analisar as principais funções do pacote com exemplos práticos.
1. Fundamentos do trabalho com o pacote regexp
O pacote regexp segue o princípio "compile uma vez, use muitas vezes". Isso melhora o desempenho ao aplicar repetidamente o mesmo padrão. Funções principais:
regexp.Compile(expr)— compila a expressão regular. Retorna*Regexpe um erro.regexp.MustCompile(expr)— faz o mesmo, mas causa pânico em caso de erro. Conveniente para inicializar variáveis globais.regexp.MatchString(expr, s)— verifica se a stringscontém pelo menos uma correspondência com o padrão.
package main
import ( "fmt" "regexp")
func main() { // Verificação simples: a string contém dígitos? matched, _ := regexp.MatchString(`\\d+`, "Pedido nº12345") fmt.Println(matched) // true
// Compilamos o padrão para uso repetido re := regexp.MustCompile(`[a-z]+`) fmt.Println(re.MatchString("hello")) // true fmt.Println(re.MatchString("HELLO")) // false}Observe: por padrão, MatchString procura correspondência parcial (como strings.Contains). Para correspondência total da string com o padrão, use as âncoras ^ e $.
2. Pesquisa e extração de dados
Para pesquisar todas as correspondências ou a primeira ocorrência, use os métodos FindString, FindAllString, FindStringSubmatch e seus análogos para slices de bytes.
2.1. Pesquisar a primeira correspondência
re := regexp.MustCompile(`\\b\\w+@\\w+\\.\\w+\\b`)email := re.FindString("Contate-nos: support@example.com ou info@test.org")fmt.Println(email) // support@example.com2.2. Pesquisar todas as correspondências
re := regexp.MustCompile(`\\d{4}`)numbers := re.FindAllString("Códigos: 1234, 5678, 9012", -1)fmt.Println(numbers) // [1234 5678 9012]O segundo argumento de FindAllString é o número máximo de correspondências. -1 significa "todas".
2.3. Grupos de captura (submatch)
Grupos de captura permitem extrair partes da correspondência. Eles são definidos por parênteses ().
re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`)match := re.FindStringSubmatch("user@example.com")fmt.Println(match) // [user@example.com user example.com]// match[0] — correspondência completa// match[1] — primeiro grupo (user)// match[2] — segundo grupo (example.com)3. Substituição de texto com expressões regulares
O pacote regexp fornece dois métodos principais para substituição:
ReplaceAllString(src, repl)— substitui todas as correspondências pela stringrepl.ReplaceAllStringFunc(src, replFunc)— substitui cada correspondência usando uma função de retorno de chamada.
3.1. Substituição simples
re := regexp.MustCompile(`\\s+`)result := re.ReplaceAllString("Muitos espaços aqui", " ")fmt.Println(result) // "Muitos espaços aqui"3.2. Substituição usando grupos de captura
Na string de substituição, você pode referenciar grupos através de $1, $2, etc.
re := regexp.MustCompile(`(\\w+)\\s+(\\w+)`)result := re.ReplaceAllString("João Silva", "$2, $1")