Dans ce tutoriel je vous propose de découvrir ensemble les lookaround Qui sont des assertions de taille 0 (comme le ^
, $
ou \b
) qui permettent de faire des assertions sans déplacer le curseur d'exploration.
Lookahead
Le lookahead permet de regarder au delà du curseur pour détecter si un élément est suivi ou non par un autre. Il peut être positif ou négatif
(?=ASSERTION)
, positive lookahead(?!ASSERTION)
, negative lookahead
Une fois l'assertion résolue le curseur n'est pas déplacé, l'expression régulière reprend là où elle s'était arrêtée avant le lookahead.
Par exemple, on peut chercher le mot "panthère" qui n'est pas suivi par le mot "noire".
/panthère(?! noire)/
Pour un cas plus concret, on peut cumuler les lookahead pour vérifier qu'un mot de passe contienne au moins une majuscule et un chiffre
/(?=[^A-Z]*[A-Z])(?=\D*\d).{8,}/
(?=[^A-Z]*[A-Z])
, permet de trouver la présence d'une majuscule(?=\D*\d)
, permet de trouver un nombre.{8,}
, permet de vérifier que le mot de passe contient plus de 8 caractères (sachant que les 2 conditions préalables ont déjà été satisfaites)
Lookbehind
Le lookbehind fonctionne sur le même principe mais en regardant avant le curseur. En revanche, vu qu'il revient en arrière sa taille doit être connu à l'avance et il n'est pas possible d'utiliser de quantificateur dynamique (comme *
ou +
).
(?<=ASSERTION)
, positive lookbehind(?<!ASSERTION)
, negative lookbehind
Par exemple si je veux trouver tous les mots qui se terminent avec un s je peux commencer par trouver tous les mots \b\w+\b
puis utiliser le lookbehind avant le dernier \b
pour ajouter une assertion supplémentaire sur les caractères situé à la fin du mot.
/\b\w+(?<=s)\b/gu
De la même manière, je peux utiliser le "negative lookbehind" pour trouver l'inverse (les mots qui ne finissent pas par la lettre s
).
/\b\w+(?<!s)\b/gu