Expressions régulières en Go avec exemples : en pratique
\n\nLes expressions régulières (regexp) sont un outil puissant pour rechercher, extraire et remplacer du texte selon un motif. En Go (Golang), le travail avec les regex est implémenté via le package standard regexp. Dans cet article, nous analyserons les fonctions principales, la syntaxe et fournirons des exemples pratiques pour vous aider à utiliser les expressions régulières en toute confiance dans vos projets.
Fondamentaux du package regexp
\n\nLe package regexp propose deux méthodes principales pour compiler une expression régulière :
- \n
regexp.Compile(pattern string) (*Regexp, error)— compile le motif et retourne un objetRegexpou une erreur si le motif est incorrect. \n regexp.MustCompile(pattern string) *Regexp— fait la même chose, mais déclenche unepanicen cas d'erreur. Pratique pour les motifs statiques définis lors de l'initialisation. \n
Il est recommandé d'utiliser MustCompile pour les motifs garantis corrects (par exemple, définis dans le code) et Compile pour les motifs dynamiques provenant de l'utilisateur ou d'une source externe.
Exemple 1 : Recherche d'une sous-chaîne (FindString)
\n\nLa fonction FindString retourne la première correspondance avec le motif sous forme de chaîne. S'il n'y a pas de correspondance, elle retourne une chaîne vide.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Mon email : example@mail.com, secondaire : 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 trouvé :", match) // Affiche : example@mail.com\n}\n\nExemple 2 : Recherche de toutes les correspondances (FindAllString)
\n\nSi vous devez trouver toutes les correspondances, utilisez FindAllString. Le deuxième argument est le nombre maximum de correspondances (-1 pour toutes).
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Codes : 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("Codes trouvés :", matches)\n // Affiche : [ABC-123 XYZ-456 QWE-789]\n}\n\nExemple 3 : Remplacement de texte (ReplaceAllString)
\n\nReplaceAllString remplace toutes les correspondances du motif par la chaîne spécifiée. Vous pouvez utiliser des groupes de capture avec la syntaxe $1, $2, etc.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Date : 2024-01-15, autre date : 2023-12-31"\n pattern := `(\\d{4})-(\\d{2})-(\\d{2})`\n\n re := regexp.MustCompile(pattern)\n // Change le format de AAAA-MM-JJ à JJ.MM.AAAA\n result := re.ReplaceAllString(text, "$3.$2.$1")\n\n fmt.Println("Résultat :", result)\n // Affiche : Date : 15.01.2024, autre date : 31.12.2023\n}\n\nExemple 4 : Vérification de la conformité d'une chaîne au motif (MatchString)
\n\nLa fonction MatchString retourne true si la chaîne contient au moins une correspondance avec le motif.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n emails := []string{"user@example.com", "email-invalide", "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 valide\\n", email)\n } else {\n fmt.Printf("'%s' — email NON valide\\n", email)\n }\n }\n // Affiche :\n // 'user@example.com' — email valide\n // 'email-invalide' — email NON valide\n // 'admin@site.org' — email valide\n}\n\nExemple 5 : Extraction de données avec des groupes de capture (FindStringSubmatch)
\n\nFindString