Groupes et références arrière

Regroupez des caractères avec des parenthèses, créez des branches avec l'alternance, puis capturez une correspondance et réutilisez-la plus loin dans le même motif grâce à une référence arrière (backreference).

Lire les règles : Groupes : capturer et nommer dans le Guide →S'entraîner : Motifs retors →

Fait suite à Ancres et limites

Ce que vous allez apprendre

Regroupement Alternance Groupes non capturants Références arrière Palindromes

Étapes · 13

  1. 01Regrouper avec des parenthèsesBriefing
  2. 02Un groupe forme une unitéChasse
  3. 03Un quantificateur sur un groupeChasse
  4. 04L'alternance avec la barre verticaleChasse
  5. 05Surligner les alternativesChasse
  6. 06Regrouper les alternativesChasse
  7. 07Des groupes qui ne capturent pasChasse
  8. 08Références arrièreChasse
  9. 09Un palindrome de cinq lettresChasse
  10. 10Un mot répétéChasse
  11. 11Un groupe facultatifChasse
  12. 12Golf : syllabe répétéeChasse
  13. 13Capture et rappel maîtrisésBriefing

Groupes, alternance et références arrière en regex

Dans une expression régulière, des parenthèses forment un groupe : plusieurs caractères traités comme une seule unité. Placez un quantificateur après le groupe et il répète toute l'unité, pas seulement le dernier caractère. Mettez une barre verticale | à l'intérieur et vous obtenez une alternance, une liste de choix dont n'importe lequel peut correspondre.

Un groupe simple ( ) capture aussi. Il retient le texte exact qu'il a trouvé, et une référence arrière comme \1 redemande ce même texte plus loin dans le motif. C'est ainsi qu'une regex trouve des lettres répétées, des guillemets qui se répondent ou un mot tapé deux fois. Les groupes sont numérotés selon leur parenthèse ouvrante, en comptant depuis la gauche.

Quand vous voulez le regroupement sans la mémoire, écrivez un groupe non capturant, (?:...). Il regroupe et crée des branches de la même façon, et garde bien en ordre la numérotation de vos autres groupes. Dans une chasse, un groupe bien placé fait souvent la différence entre un motif qui attrape les cibles et un motif qui attrape aussi les innocents.

Exemples

  1. /^(?:un|re)do$/

    Attrapés

    • undo
    • redo

    Épargnés

    • do
    • outdo
    • undone

    Le groupe isole le choix entre un et re du reste du motif, et les ancres écartent les mots plus longs.

  2. /^(\d{3}-)?\d{4}$/

    Attrapés

    • 555-0199
    • 0199

    Épargnés

    • 55-0199
    • 555-019
    • 5550-199

    Le ? après le groupe rend tout l'indicatif facultatif, tiret compris, jamais à moitié.

  3. /^(ha)+!$/

    Attrapés

    • ha!
    • haha!
    • hahaha!

    Épargnés

    • hah!
    • ha
    • aha!

    Le + après le groupe répète tout le ha, pas seulement le a : un h égaré avant le ! est donc épargné.

  4. /(["']).*\1/

    Attrapés

    • "hi"
    • 'ok'
    • say 'yo'

    Épargnés

    • "hi'
    • 'ok"
    • no quotes

    Une référence arrière oblige le guillemet fermant à être celui qui a ouvert le texte.

Erreurs courantes

  • Laisser l'alternance sans parenthèses. La barre verticale a la priorité la plus basse, donc ^red|blue$ veut dire ^red ou blue$ ; entourez les choix, ^(red|blue)$, quand les ancres doivent s'appliquer aux deux.
  • Utiliser des crochets pour des mots. [red|blue] est une classe de caractères qui correspond à une seule lettre de cet ensemble (ou à la barre verticale elle-même), pas au mot red ou blue.
  • Décaler vos références arrière. Un nouveau groupe capturant placé plus tôt dans le motif renumérote tous les groupes suivants, et \1 pointe soudain ailleurs ; utilisez (?:...) pour les groupes que vous ne rappelez jamais.

Lire les règles : Groupes : capturer et nommer dans le Guide →S'entraîner : Motifs retors →

À lire aussi : Les références arrière en regex : des motifs qui se souviennent de ce qu'ils ont trouvé →

À lire aussi : Groupes nommés et groupes non capturants en regex →