Expressions Régulières

Expressions régulières #

// Go offre de base un support des [expressions régulières](https://fr.wikipedia.org/wiki/Expression_rationnelle) (ou regex, pour regular expression).
// Voici quelques exemples de tâches courantes sur les `regex` en Go.

package main

import "bytes"
import "fmt"
import "regexp"

func main() {

    // Ceci teste si un motif ("p([a-z]+)ch") correspond à une chaîne.
    match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
    fmt.Println(match)

    // Au dessus nous avec utiliser un motif directement, mais pour d'autres tâches il faut la compile en une structure `Regexp` optimisée.
    r, _ := regexp.Compile("p([a-z]+)ch")

    // Plusieurs méthodes sont disponibles. Voici le même test que celui vu plus tôt.
    fmt.Println(r.MatchString("peach"))

    // Ceci trouve l'association pour la regex.
    fmt.Println(r.FindString("peach punch"))

    // Ceci trouve également la première correspondance mais renvoie l'indice de début et fin de la correspondance, au lieu de renvoyer le text correspondant.
    fmt.Println(r.FindStringIndex("peach punch"))

    // La variante `Submatch` inclue des informations sur les associations au niveau du pattern entier, ainsi que les sous-correspondances à l'intérieur du motif.
    // Par exemple ici, cela renverra des informations à la fois sur `p([a-z]+)ch` et `([a-z]+)`.
    fmt.Println(r.FindStringSubmatch("peach punch"))

    // De la même manière, cela donne des inforamtions sur les indices de correspondances globales et les sous-correspondances.
    fmt.Println(r.FindStringSubmatchIndex("peach punch"))

    // Les variantes  `All` de ces fonctions s'appliquent à toutes les correspondances du texte d'entrée, pas juste la première.
    // Par exemple pour trouver toutes les correspondances d'une regex.
    fmt.Println(r.FindAllString("peach punch pinch", -1))

    // Ces variantes `All` sont également disponibles pour toutes les autres méthodes vues plus haut
    fmt.Println(r.FindAllStringSubmatchIndex(
        "peach punch pinch", -1))

    // Fournir un entier non négatif en second argument à ces fonctions limite le nombre de résultats.
    fmt.Println(r.FindAllString("peach punch pinch", 2))

    // Nos examples ci-dessus avaient comme arguments des strings et avaient des noms comme `MatchString`. On peut également fournir des arguments `[]byte` et oublier le `String` des nombres de fonction.
    fmt.Println(r.Match([]byte("peach")))

    // Lorsqu'on crée des constrantes avec des expressions régulières, on peut utiliser la variation `MustCompile`  de `Compile`. Un simple `Compile` ne marchera pas car il a deux valeurs de retour.
    r = regexp.MustCompile("p([a-z]+)ch")
    fmt.Println(r)

    // Le package `regexp` peut également être utilisé pour remplacer des sous-ensembles de chaînes avec d'autres valeurs.
    fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))

    // La variante `Func` permet de transformer les textes de correspondance selon une fonction donnée.
    in := []byte("a peach")
    out := r.ReplaceAllFunc(in, bytes.ToUpper)
    fmt.Println(string(out))
}
$ go run regular-expressions.go 
true
true
peach
[0 5]
[peach ea]
[0 5 1 3]
[peach punch pinch]
[[0 5 1 3] [6 11 7 9] [12 17 13 15]]
[peach punch]
true
p([a-z]+)ch
a <fruit>
a PEACH

# Pour une référence complète sur les expressions régulières en Go, regardez la documentation du package [`regexp`](http://golang.org/pkg/regexp/).