Expresiones regulares en Go con ejemplos: en la práctica
\n\nLas expresiones regulares (regexp) son una herramienta poderosa para buscar, extraer y reemplazar texto según un patrón. En Go (Golang), el trabajo con expresiones regulares se implementa a través del paquete estándar regexp. En este artículo, analizaremos las funciones principales, la sintaxis y proporcionaremos ejemplos prácticos que le ayudarán a utilizar con confianza las expresiones regulares en sus proyectos.
Fundamentos del paquete regexp
\n\nEl paquete regexp proporciona dos formas principales de compilar una expresión regular:
- \n
regexp.Compile(pattern string) (*Regexp, error)— compila el patrón y devuelve un objetoRegexpo un error si el patrón es incorrecto. \n regexp.MustCompile(pattern string) *Regexp— hace lo mismo, pero genera unpanicen caso de error. Es útil para patrones estáticos definidos en la fase de inicialización. \n
Se recomienda usar MustCompile para patrones que se garantiza que son correctos (por ejemplo, definidos en el código) y Compile para patrones dinámicos obtenidos del usuario o de una fuente externa.
Ejemplo 1: Búsqueda de subcadena (FindString)
\n\nLa función FindString devuelve la primera coincidencia con el patrón como una cadena. Si no hay coincidencias, devuelve una cadena vacía.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Mi email: example@mail.com, de respaldo: test@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) // Salida: example@mail.com\n}\n\nEjemplo 2: Búsqueda de todas las coincidencias (FindAllString)
\n\nSi necesita encontrar todas las coincidencias, use FindAllString. El segundo argumento es el número máximo de coincidencias (-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 // Salida: [ABC-123 XYZ-456 QWE-789]\n}\n\nEjemplo 3: Reemplazo de texto (ReplaceAllString)
\n\nReplaceAllString reemplaza todas las coincidencias del patrón con la cadena especificada. Se pueden usar grupos de captura con la sintaxis $1, $2, etc.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Fecha: 2024-01-15, otra fecha: 2023-12-31"\n pattern := `(\\d{4})-(\\d{2})-(\\d{2})`\n\n re := regexp.MustCompile(pattern)\n // Cambiamos el formato de AAAA-MM-DD a DD.MM.AAAA\n result := re.ReplaceAllString(text, "$3.$2.$1")\n\n fmt.Println("Resultado:", result)\n // Salida: Fecha: 15.01.2024, otra fecha: 31.12.2023\n}\n\nEjemplo 4: Verificación de coincidencia de cadena con patrón (MatchString)
\n\nLa función MatchString devuelve true si la cadena contiene al menos una coincidencia con el patrón.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n emails := []string{"user@example.com", "invalid-email", "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 NO válido\\n", email)\n }\n }\n // Salida:\n // 'user@example.com' — email válido\n // 'invalid-email' — email NO válido\n // 'admin@site.org' — email válido\n}\n\nEjemplo 5: Extracción de datos con grupos de captura (FindStringSubmatch)
\n\nFindString