Expresiones regulares en Go: análisis completo con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Expresiones regulares en Go con ejemplos: en la práctica

\n\n

Las 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.

\n\n

Fundamentos del paquete regexp

\n\n

El paquete regexp proporciona dos formas principales de compilar una expresión regular:

\n\n
    \n
  • regexp.Compile(pattern string) (*Regexp, error) — compila el patrón y devuelve un objeto Regexp o un error si el patrón es incorrecto.
  • \n
  • regexp.MustCompile(pattern string) *Regexp — hace lo mismo, pero genera un panic en caso de error. Es útil para patrones estáticos definidos en la fase de inicialización.
  • \n
\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.

\n\n

Ejemplo 1: Búsqueda de subcadena (FindString)

\n\n

La función FindString devuelve la primera coincidencia con el patrón como una cadena. Si no hay coincidencias, devuelve una cadena vacía.

\n\n
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\n

Ejemplo 2: Búsqueda de todas las coincidencias (FindAllString)

\n\n

Si necesita encontrar todas las coincidencias, use FindAllString. El segundo argumento es el número máximo de coincidencias (-1 para todas).

\n\n
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\n

Ejemplo 3: Reemplazo de texto (ReplaceAllString)

\n\n

ReplaceAllString reemplaza todas las coincidencias del patrón con la cadena especificada. Se pueden usar grupos de captura con la sintaxis $1, $2, etc.

\n\n
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\n

Ejemplo 4: Verificación de coincidencia de cadena con patrón (MatchString)

\n\n

La función MatchString devuelve true si la cadena contiene al menos una coincidencia con el patrón.

\n\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\n

Ejemplo 5: Extracción de datos con grupos de captura (FindStringSubmatch)

\n\n

FindString

Blogs

Book Recommendations