Cet article présente les différentes syntaxes d’expressions régulières. Ce n’est pas une introduction ou un tutoriel, il en existe déjà de très bons sur le web [1], ainsi que des outils en ligne pour les tester [2]. Les expressions régulières sont un outil indispensable pour les développeurs et autres administrateurs système.

Comme d’habitude en informatique, il existe plusieurs syntaxes pour les déclarer : BRE, ERE, PCRE et celles de Vim. Les deux premières sont définies dans la norme POSIX et sont étendues par plusieurs programmes du projet GNU. Ces extensions offrent l’avantage d’homogénéiser ces deux variantes. Les PCRE sont plus riches et plus puissantes. Quant à Vim, il utilise pas moins de 4 syntaxes différentes (\v very magic, \m magic, \M nomagic, \V very nomagic).

La différence principale entre ces variantes est que le backslash est utilisé tantôt pour activer la signification spéciale d’un méta caractère, tantôt pour la désactiver.

Voici les syntaxes utilisées par différents outils :

  • sedutilise BRE ou ERE (sed -r)
  • grep utilise BRE, ERE (grep -E ou egrep) ou PCRE (grep -P).
  • ack utilise PCRE
  • Les principaux langages de programmation utilisent PCRE

Fort heureusement, certains concepts ne dépendent pas de la syntaxe.

                     
  BRE ERE PCRE \v \m \M \V      
+ + + + + \+ \+ \+      
? ? ? ? ? \? \? \?      
expression intervalle \{n,m\} {n,m} {n,m} {n,m} \{n,m} \{n,m} \{n,m}      
groupe et capture \(\) () () () \(\) \(\) \(\)      
références arrières \n \n \n \n \n \n \n      
alternation |             | | |
capture de mot \<\> \<\> \b <> \<\> \<\> \<\>      
positive lookahead     (?=…) @= \@= \@= \@=      
negative lookahead     (?!…) @! \@! \@! \@!      
positive lookbehind     (?<=…) @<= \@<= \@<= \@<=      
negative lookbehind     (?<!…) @<! \@<! \@<! \@<!      

En rouge, les extensions GNU à la norme POSIX

Conclusion

Je vous conseille d’utiliser au maximum une syntaxe proche de Perl car c’est la plus puissante. Avec Vim, utiliser le mode very magic en utilisant ce mapping.

nnoremap / /\v

Utiliser aussi sed -r car la syntaxe ERE est plus proche de PCRE que BRE. Enfin, remplacer grep par ack qui utilise la syntaxe de Perl.

Liens utiles

[1] regular-expression.info

[2] regex101.com