: 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
Sources