Regular Expressions
Lookahead et Lookbehind
Recherche…
Syntaxe
- Regard positif:
(?=pattern)
- Lookahead négatif:
(?!pattern)
- Lookbehind positif :
(?<=pattern)
- Lookbehind négatif :
(?<!pattern)
Remarques
Non pris en charge par tous les moteurs regex.
En outre, de nombreux moteurs de regex limitent les modèles à l'intérieur des styles à des chaînes de longueur fixe. Par exemple, le modèle (?<=a+)b
doit correspondre au b
dans aaab
mais génère une erreur dans Python.
Les groupes de capture sont autorisés et fonctionnent comme prévu, y compris les références arrière. Le lookahead / lookbehind lui-même n'est pas un groupe de capture, cependant.
Les bases
Un lookahead positif (?=123)
affirme que le texte est suivi par le motif donné, sans inclure le motif dans la correspondance. De même, un lookbehind positif (?<=123)
affirme que le texte est précédé du motif donné. Remplacer le =
avec !
nie l'assertion.
Entrée : 123456
-
123(?=456)
correspond à123
( résultat positif ) -
(?<=123)456
correspond à456
( lookbehind positif ) -
123(?!456)
échoue ( tête de lecture négative ) -
(?<!123)456
échoue ( lookbehind négatif )
Entrée : 456
-
123(?=456)
échoue -
(?<=123)456
échoue -
123(?!456)
échoue -
(?<!123)456
correspondances456
Utiliser lookbehind pour tester les fins
Un lookbehind peut être utilisé à la fin d'un pattern pour s'assurer qu'il se termine ou non d'une certaine manière.
([az ]+|[AZ ]+)(?<! )
correspond uniquement aux séquences de mots minuscules ou uniquement de mots en majuscule tout en excluant les espaces de fin.
Simulation d'une longueur variable avec \ K
Certaines versions de regex (Perl, PCRE, Oniguruma, Boost) ne supportent que les lookbehinds de longueur fixe, mais offrent la fonctionnalité \K
, qui peut être utilisée pour simuler une apparence de longueur variable au début d'un motif. En rencontrant un \K
, le texte correspondant jusqu'à ce point est ignoré et seul le texte correspondant à la partie du motif suivant \K
est conservé dans le résultat final.
ab+\Kc
Est équivalent à:
(?<=ab+)c
En général, un motif de la forme:
(subpattern A)\K(subpattern B)
Finit par être similaire à:
(?<=subpattern A)(subpattern B)
Sauf si le sous-modèle B peut correspondre au même texte que le sous-modèle A - vous pourriez vous retrouver avec des résultats subtilement différents, car le sous-modèle A consomme toujours le texte, contrairement à un vrai lookback.