Expressions régulières en Go avec exemples : en pratique
Les expressions régulières (regex) sont un outil puissant pour rechercher, extraire et remplacer du texte selon un motif. En Go (Golang), le package standard regexp est utilisé pour cela, offrant une API efficace et sécurisée. Dans cet article, nous analyserons les principales fonctionnalités du package à l'aide d'exemples concrets qui vous aideront à appliquer immédiatement ces connaissances dans des projets réels.
Fondamentaux du package regexp en Go
Le package regexp implémente une syntaxe d'expressions régulières compatible avec RE2 (à l'exception des références arrière et des lookahead/lookbehind). Cela le rend rapide et prévisible. Fonctions principales :
regexp.Compile(pattern)— compile le motif en un objetRegexp. Renvoie une erreur si le motif est incorrect.regexp.MustCompile(pattern)— fait la même chose, mais provoque une panique en cas d'erreur. Pratique pour les motifs statiques.MatchString(pattern, s)— vérifie si la chaînescontient une sous-chaîne correspondant au motif.
Utilisez toujours Compile pour les motifs dynamiques (par exemple, provenant d'une saisie utilisateur) et MustCompile pour ceux codés en dur.
package main
import ( "fmt" "regexp")
func main() { // Utilisation de MustCompile pour un motif statique re := regexp.MustCompile(`hello`) match := re.MatchString("hello world") fmt.Println(match) // true
// Compile pour un motif dynamique pattern := "[0-9]+" re2, err := regexp.Compile(pattern) if err != nil { fmt.Println("Erreur de compilation :", err) return } fmt.Println(re2.MatchString("abc123")) // true}Recherche et extraction de données
Souvent, il ne suffit pas de vérifier une correspondance, il faut extraire des parties spécifiques d'une chaîne. Pour cela, on utilise les méthodes FindString, FindStringSubmatch et FindAllString.
Extraction de la première correspondance
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\d+`) text := "Code : 12345, prix : 678" // Première correspondance first := re.FindString(text) fmt.Println(first) // 12345 // Toutes les correspondances all := re.FindAllString(text, -1) fmt.Println(all) // [12345 678]}Extraction de groupes (sous-correspondances)
Les groupes dans le motif (indiqués par des parenthèses) permettent d'extraire des parties de la correspondance. La méthode FindStringSubmatch renvoie une slice dont le premier élément est la correspondance complète, et les suivants sont les valeurs des groupes.
package main
import ( "fmt" "regexp")
func main() { // Motif : nom d'utilisateur @domaine re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`) email := "user@example.com" match := re.FindStringSubmatch(email) if len(match) > 0 { fmt.Println("Email complet :", match[0]) // user@example.com fmt.Println("Nom d'utilisateur :", match[1]) // user fmt.Println("Domaine :", match[2]) // example.com }}La méthode FindAllStringSubmatch fait la même chose pour toutes les correspondances dans la chaîne.
Remplacement de texte avec les expressions régulières
Le package regexp fournit deux méthodes pour le remplacement : ReplaceAllString (remplacement simple) et ReplaceAllStringFunc (remplacement à l'aide d'une fonction).
Remplacement simple
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\s+`) // un ou plusieurs espaces text := "Bonjour Monde Go" result := re.ReplaceAllString(text, " ") fmt.Println(result) // Bonjour Monde Go}Remplacement avec utilisation de groupes
Dans la chaîne de remplacement, vous pouvez faire réf