Soyez réguliers (1)
Niveau :
Résumé : perl -pe ‘s///’
Il arrive régulièrement d’avoir à développer des expressions régulières. Si on excepte grep et sed, la plupart des outils utilisant des expressions régulières sont compatibles perl (en utilisant PCRE). C’est donc un bon point. Apprendre les expression régulières (qu’on peut considérer comme un langage à part entière) ne sera pas perdu même si on change d’outil ou de langage.
Tests
Avant de développer une expression régulière, je vous propose de vous familiariser avec le test de ces expressions. Si vous avec une ligne de commande c’est tout simple, hop un test ligne par ligne :
$ perl -pe 's/expression/########/' données a matcher, autant que vous voulez <ctrl-d>
Mais si vous préférez un interface plus évoluée : voici un des nombreux qui permettent de tester vos expressions en direct http://myregexp.com/ et avec coloration des éléments matchés.
Syntaxe de base
Une expression régulière, c’est une chaîne de caractère qui a pour but de repérer des informations dans un texte. Elles sont en général implémentées sous forme d’automates à état finis. Cette méthode est extrêmement efficace et dans la plupart des cas il est très difficile de faire plus rapide.
Cette chaîne peut être utilisée pour chercher des informations dans un texte, mais aussi pour faire des remplacements automatisés. Perl utilise une syntaxe autour des expressions régulières pour préciser comment les utiliser. Celle-ci est souvent reprise par les utilisateurs des PCRE mais ca n’a rien d’obligatoire :
- /expression/ : pour faire des recherches
- s/expression/remplacement/ pour faire du recherche/remplacer
- y/expression/remplacement/ pour faire des substitutions de caractères
y/// est un cas particulier que nous ignorerons.
Chacune de ces chaînes peut être suivie par un modificateur. Le plus utile est /i qui permet de ne pas se soucier de la casse. Exemple : /toto/i matchera ToTo. Le deuxième plus important est /g qui permet de faire le remplacement autant de fois que c’est possible et non pas seulement la première fois que l’expression matche.
Attention, hors perl, il se peut que tout ceci ne soit pas valable, mais cela ne change rien quant à la syntaxe des expressions expliquée ci après.
Syntaxe des expressions
Le principe d’une expression régulière (abrégé en regex) est de matcher des milliers de possibilités sans devoir toutes les écrire. Il ne s’agit donc (quasiment) que de “raccourcis”.
Donc commençons par les non-raccourcis :
- () : les parenthèses ont deux fonctions, grouper des éléments entre eux et mémoriser le contenu matché pour le rendre réutilisable par la suite
- | : opérateur OU comme dans “confiture ou nutella ?”
Exemples :
^vive (la confiture|le nutella)$
Maintenant les raccourcis :
- . : n’importe quel caractère
- ^ $ : début et fin de chaîne
- [abf] : a ou b ou f
- [a-m] : a ou b ou … ou m
- [^a b] : tout sauf a ou espace ou b
- d : un chiffre
- w : un caractère alphanumérique
- W : un caractère non alphanumérique
- s : un caractère d’espacement
- S : un caractère de non-espacement
- a? : 0 ou 1 fois a
- b+ : 1 ou plus fois b
- c* : 0 ou plus fois c
- d{3} : 3 fois d
- …
Il y en a plein d’autres, mais avec celles-ci vous saurez vous débrouiller dans la plupart des situations.
Exemples :
# récupérer le hostname d'un nom de domaine dans $1 (w+)(.w+)* # récupérer une heure/minute/seconde en début de ligne dans $1, $2 et $3 ^(dd):(dd):(dd)s # matche une ligne variable="valeur" avec ou sans guillemets et des espaces autorisés ^s*(w+)s*=s*"?(.*)"?
Après cette petite initiation sans conséquences, vous pouvez aller lire la vraie documentation fournie en manpage avec la documentation perl man perlre.