Pourquoi les lookarounds sont importants
Les lookarounds permettent à une expression régulière de vérifier le contexte autour d’une correspondance sans inclure ce contexte dans le résultat final.
Ils rendent possibles des validations et des filtrages complexes tout en conservant des correspondances propres.
Même s’ils peuvent sembler impressionnants au premier abord, ils permettent souvent d’écrire des regex plus simples et plus faciles à maintenir.
Les lookarounds ne consomment jamais de caractères
Contrairement aux classes de caractères ou aux groupes, les lookarounds ne consomment jamais de caractères.
Ils vérifient simplement qu’une condition est vraie avant ou après la position courante.
Comprendre cette notion d’assertion de largeur nulle est la clé pour maîtriser les lookarounds.
Lookahead ou lookbehind ?
Les lookaheads examinent ce qui suit la position courante, tandis que les lookbehinds examinent ce qui la précède.
Dans les deux cas, la condition est vérifiée sans modifier la partie effectivement matchée.
Le choix dépend simplement de l’endroit où se trouve l’information que vous souhaitez contrôler.
Les lookarounds simplifient les validations
Les lookarounds sont souvent utilisés pour vérifier plusieurs contraintes indépendantes dans une seule expression régulière.
La validation des mots de passe est l’exemple le plus connu : présence d’une majuscule, d’un chiffre et d’un caractère spécial sans avoir à les capturer.
Cette approche permet d’exprimer clairement les règles de validation tout en évitant des patterns redondants.
Les erreurs fréquentes avec les lookarounds
Une erreur fréquente consiste à penser que le contenu vérifié par un lookaround fera partie du résultat matché.
Une autre est d’oublier que certains moteurs regex imposent des limitations sur les lookbehinds ou sur leur longueur.
Lorsque vous utilisez des assertions avancées, il est indispensable de tester la regex dans le moteur réellement utilisé par votre application.
Les lookarounds dans les regex du quotidien
Les lookarounds sont utilisés dans la validation de mots de passe, l’extraction de montants, l’analyse de journaux, la coloration syntaxique et de nombreux traitements de texte.
Ils permettent d’exprimer des contraintes complexes sans rendre les regex beaucoup plus longues.
Une fois maîtrisés, ils remplacent souvent des constructions beaucoup plus compliquées.
Lookahead positif
Un lookahead positif vérifie qu’un motif se trouve immédiatement après la position courante.
Le texte contrôlé doit être présent, mais il n’est pas inclus dans la correspondance finale.
\b\w+(?=:)
Lookahead négatif
Un lookahead négatif vérifie qu’un motif ne suit pas la position courante.
Il est souvent utilisé pour exclure certains suffixes, certaines extensions ou certains formats.
\b\w+\b(?!:)
Lookbehind positif
Un lookbehind positif vérifie ce qui se trouve immédiatement avant la position courante.
Le texte précédent doit être présent, mais il n’est pas inclus dans la correspondance finale.
(?<=€)\d+
Lookbehind négatif
Un lookbehind négatif vérifie qu’un motif ne précède pas immédiatement la position courante.
Il permet d’exclure les valeurs précédées par un préfixe ou un symbole particulier.
(?<!€)\b\d+\b
Plusieurs lookaheads
Plusieurs lookaheads peuvent être enchaînés afin de contrôler des conditions indépendantes.
Cette technique est souvent utilisée pour imposer une majuscule, un chiffre et un caractère spécial dans un mot de passe.
^(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).+$
Assertions de largeur nulle
Les lookarounds sont appelés assertions de largeur nulle, car ils vérifient une condition sans consommer de caractères.
Seule la partie située en dehors de l’assertion est incluse dans la correspondance finale.
chat(?=on)
Combiner lookahead et lookbehind
Un lookahead et un lookbehind peuvent encadrer la même correspondance.
Cela permet d’extraire une valeur uniquement lorsque son préfixe et son suffixe respectent les conditions attendues.
(?<=€)\d+(?= TTC)
Lookarounds avec groupes et alternatives
Des groupes et des alternatives peuvent être placés à l’intérieur d’un lookaround afin d’accepter plusieurs contextes.
Le texte environnant reste hors du match, tout en autorisant des conditions plus flexibles.
(?<=\b(?:M\.|Dr)\s)\w+