Les notes de Rémi Prévost
vim, git, ruby, html5 et autres buzzwords.


Expressions régulières : les lookarounds

Une des fonctionnalités des expressions régulières les plus méconnues est le concept des lookarounds. Leur fonction principale consiste à capturer une certaine partie de l’expression seulement si elle est (positive) ou si elle n’est pas (negative) précédée par (lookbehind) ou suivie (lookahead) par une autre expression. Cela s’avère être très pratique lorsqu’on veut capturer une expression dans un contexte de négation.

Par exemple, si je veux chercher tous les nombres entiers qui ne sont pas précédés par une espace, il est facile de faire :

# facile!
/[^\s][0-9]+/

Au-delà d’un caractère négatif, cela ne fonctionne plus. Qu’arrive-t-il si, par exemple, on veut chercher tous les nombres entiers qui ne sont pas précédés par la chaine "Prix: " ?

# oups, ça ne fonctionne pas…
/[^P][^r][^i][^x][^:][^\s][0-9]+/

C’est donc là qu’utiliser un “negative lookbehind” se révèle être la meilleure solution :

# on capture tous les nombres qui ne sont pas précédés par "Prix: " ou par un autre chiffre.
/(?<!Prix:\s|[0-9])[0-9]+/

# dans Vim, on utilisera :
/\v(Prix:\s|[0-9])@<![0-9]+

Ce n’est pas la fonctionnalité que j’utilise le plus souvent lorsque je travaille avec des expressions régulières (j’espère qu’après avoir écrit ce billet, je l’utiliserai encore davantage) mais elle m’a fait sauvé bien du temps ces dernières semaines.

Connaissez-vous d’autres exemples concrets dans lesquels il serait pertinent d’utiliser un lookaround ?