Regex - 03 - Ancres : contrôler ou ta regex matche

Les ancres regex ^, $, et les limites de mots avec backslash-b pour des matchs precis.

03 - Ancres : contrôler ou ta regex matche

Ce que tu vas apprendre

  • ^ pour le début de chaîne ou de ligne
  • $ pour la fin de chaîne ou de ligne
  • \b pour les limites de mots
  • \B pour les non-limites de mots
  • Le mode multiline et son impact sur ^ et $

Prerequisites

Avoir compris les quantificateurs et savoir utiliser regex101.com.


Le problème du match partiel

Tu te souviens de l'article précédent ou \d{4} matchait "1234" dans "12345" ? C'est parce que la regex cherche un pattern quelque part dans le texte. Elle ne vérifié pas que le texte entier correspond au pattern.

Meme chose avec un pattern simple comme chat. Il matche dans "chat", mais aussi dans "achat", "rachat", "chaton". Parfois c'est ce que tu veux. Souvent, non.

Les ancres resolvent ce problème. Elles ne matchent pas un caractère, elles matchent une position dans le texte.

Le caret `^` : début de chaîne

Le ^ place au début d'une regex signifie "le match doit commencer au début de la chaîne".

^hello

Teste avec :

hello world
say hello
hello

Résultat : "hello world" et "hello" matchent (ils commencent par "hello"), mais "say hello" ne matche pas.

Le dollar `

Regex - 03 - Ancres : contrôler ou ta regex matche

Les ancres regex ^, $, et les limites de mots avec backslash-b pour des matchs precis.

: fin de chaîne

Le $ a la fin d'une regex signifie "le match doit se terminer a la fin de la chaîne".

world$

Teste avec :

hello world
world domination
world

Seuls "hello world" et "world" matchent. "world domination" ne matche pas parce que "world" n'est pas a la fin.

Combiner `^` et `

Regex - 03 - Ancres : contrôler ou ta regex matche

Les ancres regex ^, $, et les limites de mots avec backslash-b pour des matchs precis.

: valider une chaîne entière

La combinaison ^...$ est extremement utile. Elle force la regex a matcher la totalite de la chaîne, pas juste un morceau.

Exemple : valider qu'une chaîne est un code postal français (5 chiffres) :

^\d{5}$

Teste avec :

75001
7500
750011
75 001
ABCDE

Seul "75001" matche. "7500" a trop peu de chiffres. "750011" en a trop. "75 001" contient un espace. "ABCDE" n'a pas de chiffres. C'est exactement le comportement qu'on veut pour de la validation.

Compare avec \d{5} sans ancres : il matcherait "750011" (les 5 premiers chiffres) et meme "abc75001xyz" (les 5 chiffres au milieu). Les ancres font toute la différence.

Un exemple plus complet : valider un email basique

Attention, valider un email par regex de facon 100% conforme a la RFC est un cauchemar. Mais une validation basique suffit souvent :

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

Ca se lit :

  • ^ début de chaîne
  • [a-zA-Z0-9._%+-]+ un ou plusieurs caractères valides avant le @
  • @ le arobase litteral
  • [a-zA-Z0-9.-]+ le domaine
  • \. un point litteral
  • [a-zA-Z]{2,} l'extension (au moins 2 lettres)
  • $ fin de chaîne

On detaillera les classes de caractères [...] dans l'article 04. Pour l'instant, retiens le pattern ^...$ pour la validation.

Les limites de mots `\b`

Le \b est une ancre qui matche la frontiere entre un caractère de mot et un caractère de non-mot. Un "caractère de mot" c'est une lettre, un chiffre ou un underscore (ce que \w matche, on le verra).

\bchat\b

Teste avec :

le chat dort
achat en ligne
chaton mignon
le chat

Seuls "le chat dort" et "le chat" matchent. "achat" et "chaton" ne matchent pas parce que "chat" n'est pas un mot isole dedans.

C'est genial pour chercher un mot exact sans matcher ses sous-chaînes. J'utilise \b constamment dans mes recherches en éditeur de code. Quand je cherche une variable id, je ne veux pas matcher hidden, width ou provider. \bid\b resout le problème.

L'anti-limite `\B`

Le \B fait l'inverse de \b. Il matche les positions qui ne sont PAS une limite de mot.

\Bchat\B

Matche "chat" uniquement quand il est a l'intérieur d'un mot : "rachat" ne marche pas ici (le t est en fin de mot), mais "rachats" matcherait la partie "chat" car elle est entouree de caractères de mot.

Honnetement, \B est rarement utile en pratique. Je l'ai utilise peut-etre deux fois en dix ans. Mais il existe, et ca vaut le coup de savoir qu'il est la.

Le mode multiline (flag `m`)

Par défaut, ^ et $ matchent le début et la fin de la chaîne entière. Mais avec le flag m (multiline), ils matchent le début et la fin de chaque ligne.

Sur regex101, active le flag m et teste :

^bonjour

Sur ce texte :

bonjour le monde
ceci est une ligne
bonjour encore
fin

Sans flag m : seule la première ligne matche (début de la chaîne). Avec flag m : la première et la troisieme ligne matchent (début de chaque ligne).

Le mode multiline est indispensable quand tu travailles avec du texte multi-lignes (fichiers de logs, CSV, configurations). Sur paltemps.fr, on l'utilise souvent pour parser des fichiers de configuration ligne par ligne.

Exemples pratiques

Trouver les lignes de commentaire (en JavaScript) :

^\s*//

^ début de ligne, \s* zero ou plusieurs espaces, // le début du commentaire.

Trouver les lignes vides :

^$

Avec le flag m, ca matche chaque ligne vide du texte.

Trouver les mots qui commencent par une majuscule :

\b[A-Z]\w*

\b limite de mot, [A-Z] une majuscule, \w* zero ou plusieurs caractères de mot.

Valider un numero de telephone français :

^0[1-9](\d{2}){4}$

^0 commence par zero, [1-9] un chiffre de 1 a 9, (\d{2}){4} quatre groupes de deux chiffres, $ fin. Matche "0612345678" mais pas "06 12 34 56 78" (avec les espaces il faudrait adapter le pattern).

L'erreur courante : oublier les ancres en validation

Quand tu valides une saisie utilisateur, oublier ^ et $ est une faille. Si tu valides un code postal avec juste \d{5}, la chaîne "abc75001xyz" passe la validation. Ca peut sembler anodin sur un code postal, mais sur un champ de sécurité (token, code OTP), c'est un vrai problème.

Regle simple : si tu valides un format, utilise toujours ^...$.

Résumé

  • ^ matche le début de chaîne (ou de ligne avec le flag m)
  • $ matche la fin de chaîne (ou de ligne avec le flag m)
  • ^...$ force le match sur la chaîne entière : indispensable pour la validation
  • \b matche les limites de mots : parfait pour chercher des mots entiers
  • \B matche les non-limites de mots (rarement utile)
  • Le flag m (multiline) change le comportement de ^ et $ pour travailler ligne par ligne

Article précédent 02 - Quantificateurs
Article suivant 04 - Classes de caractères

Sources

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.