Expresiones regulares en Go con ejemplos: en la práctica
Las expresiones regulares (regex) son una herramienta poderosa para buscar, extraer y reemplazar texto según un patrón. En Go (Golang), para trabajar con ellas se utiliza el paquete estándar regexp, que proporciona una API eficiente y segura. En este artículo, analizaremos las principales capacidades del paquete con ejemplos concretos que le ayudarán a aplicar los conocimientos de inmediato en proyectos reales.
Fundamentos del paquete regexp en Go
El paquete regexp implementa la sintaxis de expresiones regulares compatible con RE2 (excepto las referencias inversas y lookahead/lookbehind). Esto lo hace rápido y predecible. Las funciones principales son:
regexp.Compile(pattern)— compila un patrón en un objetoRegexp. Devuelve un error si el patrón es incorrecto.regexp.MustCompile(pattern)— hace lo mismo, pero genera pánico en caso de error. Es útil para patrones estáticos.MatchString(pattern, s)— verifica si la cadenascontiene una subcadena que coincida con el patrón.
Utilice siempre Compile para patrones dinámicos (por ejemplo, de entrada de usuario) y MustCompile para aquellos definidos estáticamente en el código.
package main
import ( "fmt" "regexp")
func main() { // Usamos MustCompile para un patrón estático re := regexp.MustCompile(`hello`) match := re.MatchString("hello world") fmt.Println(match) // true
// Compile para un patrón dinámico pattern := "[0-9]+" re2, err := regexp.Compile(pattern) if err != nil { fmt.Println("Error de compilación:", err) return } fmt.Println(re2.MatchString("abc123")) // true}Búsqueda y extracción de datos
A menudo no solo se necesita verificar una coincidencia, sino extraer partes específicas de la cadena. Para ello se utilizan los métodos FindString, FindStringSubmatch y FindAllString.
Extraer la primera coincidencia
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\d+`) text := "Código: 12345, precio: 678" // Primera coincidencia first := re.FindString(text) fmt.Println(first) // 12345 // Todas las coincidencias all := re.FindAllString(text, -1) fmt.Println(all) // [12345 678]}Extraer grupos (submatches)
Los grupos en el patrón (indicados con paréntesis) permiten extraer partes de la coincidencia. El método FindStringSubmatch devuelve un slice donde el primer elemento es la coincidencia completa y los siguientes son los valores de los grupos.
package main
import ( "fmt" "regexp")
func main() { // Patrón: nombre de usuario @dominio 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("Nombre de usuario:", match[1]) // user fmt.Println("Dominio:", match[2]) // example.com }}El método FindAllStringSubmatch hace lo mismo para todas las coincidencias en la cadena.
Reemplazo de texto con expresiones regulares
El paquete regexp proporciona dos métodos para reemplazar: ReplaceAllString (reemplazo simple) y ReplaceAllStringFunc (reemplazo usando una función).
Reemplazo simple
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\s+`) // uno o más espacios text := "Hola Mundo Go" result := re.ReplaceAllString(text, " ") fmt.Println(result) // Hola Mundo Go}Reemplazo usando grupos
En la cadena de reemplazo se puede hacer referencia