HervéRenault.fr

Regexp lookbehind et lookahead

On pourrait traduire par "regarde derrière" et "regarde devant" ce qu'on veut matcher. Mais regarde seulement et ne conserve pas dans les références, de la même manière que (?:truc). Il faut lire "derrière" dans le sens de "à gauche de ce qu'on veut matcher" et "devant" dans le sens de "à droite de ce qu'on veut matcher".

Exemple : pour matcher la première valeur entre guillemets dans "ce \"truc\" est pratique", "non ?"
/"(.*?)(?<!\\\)"/
matche tout ce qui va jusqu'au prochain guillemet " qui n'est pas précédé de \ (avec \\ pour l'échappement)
La référence 1 va contenir ce \"truc\" est pratique
Alors que sans cette assertion lookbehind, ça matcherait seulement "ce \

Il y a un excellent article en anglais qui décortique le fonctionnement de ces assertions et met en garde contre des petites nuances suivant les langages de programmation : regular-expressions.info/lookaround.html

Pour grep, il faut activer le mode PCRE avec le paramètre -P comme ça :
echo 'CECI EST UN ESSAI "ce \"truc\" est pratique", "non ?" ET VOILÀ' | grep -oP '"(.*?)(?<!\\)"'
qui va afficher :

"ce \"truc\" est pratique"
"non ?"