Expressões Regulares em Go com exemplos: na prática
\n\nExpressõ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.
Fundamentos do pacote regexp
\n\nO pacote regexp oferece duas formas principais de compilar uma expressão regular:
- \n
regexp.Compile(pattern string) (*Regexp, error)— compila o padrão e retorna um objetoRegexpou um erro se o padrão for inválido. \n regexp.MustCompile(pattern string) *Regexp— faz o mesmo, mas gerapanicem caso de erro. É útil para padrões estáticos definidos em tempo de inicialização. \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.
Exemplo 1: Busca de substring (FindString)
\n\nA 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.
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\nExemplo 2: Busca de todas as correspondências (FindAllString)
\n\nSe precisar encontrar todas as correspondências, use FindAllString. O segundo argumento é o número máximo de correspondências (-1 para todas).
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\nExemplo 3: Substituição de texto (ReplaceAllString)
\n\nReplaceAllString substitui todas as correspondências do padrão pela string especificada. É possível usar grupos de captura com a sintaxe $1, $2, etc.
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\nExemplo 4: Verificação de correspondência de string com padrão (MatchString)
\n\nA função MatchString retorna true se houver pelo menos uma correspondência com o padrão na string.
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\nExemplo 5: Extração de dados com grupos de captura (FindStringSubmatch)
\n\nFindString