Soyez réguliers (1)

Niveau : Star Empty Empty Empty Empty
Résumé : perl -pe ‘s///’

Il arrive régu­liè­re­ment d’avoir à déve­lop­per des expres­sions régu­liè­res. Si on excepte grep et sed, la plu­part des outils uti­li­sant des expres­sions régu­liè­res sont com­pa­ti­bles perl (en uti­li­sant PCRE). C’est donc un bon point. Appren­dre les expres­sion régu­liè­res (qu’on peut con­si­dé­rer comme un lan­gage à part entière) ne sera pas perdu même si on change d’outil ou de lan­gage.

Tests

Avant de déve­lop­per une expres­sion régu­lière, je vous pro­pose de vous fami­lia­ri­ser avec le test de ces expres­sions. Si vous avec une ligne de com­mande c’est tout sim­ple, 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 inter­face plus évo­luée : voici un des nom­breux qui per­met­tent de tes­ter vos expres­sions en direct http://myre­gexp.com/ et avec colo­ra­tion des élé­ments mat­chés.

Syn­taxe de base

Une expres­sion régu­lière, c’est une chaîne de carac­tère qui a pour but de repé­rer des infor­ma­tions dans un texte. Elles sont en géné­ral implé­men­tées sous forme d’auto­ma­tes à état finis. Cette méthode est extrê­me­ment effi­cace et dans la plu­part des cas il est très dif­fi­cile de faire plus rapide.

Cette chaîne peut être uti­li­sée pour cher­cher des infor­ma­tions dans un texte, mais aussi pour faire des rem­pla­ce­ments auto­ma­ti­sés. Perl uti­lise une syn­taxe autour des expres­sions régu­liè­res pour pré­ci­ser com­ment les uti­li­ser. Celle-ci est sou­vent reprise par les uti­li­sa­teurs des PCRE mais ca n’a rien d’obli­ga­toire :

  • /expres­sion/ : pour faire des recher­ches
  • s/expres­sion/rem­pla­ce­ment/ pour faire du recher­che/rem­pla­cer
  • y/expres­sion/rem­pla­ce­ment/ pour faire des sub­sti­tu­tions de carac­tè­res

y/// est un cas par­ti­cu­lier que nous igno­re­rons.

Cha­cune de ces chaî­nes peut être sui­vie par un modi­fi­ca­teur. Le plus utile est /i qui per­met de ne pas se sou­cier de la casse. Exem­ple : /toto/i mat­chera ToTo. Le deuxième plus impor­tant est /g qui per­met de faire le rem­pla­ce­ment autant de fois que c’est pos­si­ble et non pas seu­le­ment la pre­mière fois que l’expres­sion mat­che.

Atten­tion, hors perl, il se peut que tout ceci ne soit pas vala­ble, mais cela ne change rien quant à la syn­taxe des expres­sions expli­quée ci après.

Syn­taxe des expres­sions

Le prin­cipe d’une expres­sion régu­lière (abrégé en regex) est de mat­cher des mil­liers de pos­si­bi­li­tés sans devoir tou­tes les écrire. Il ne s’agit donc (qua­si­ment) que de “rac­cour­cis”.

Donc com­men­çons par les non-rac­cour­cis :

  • () : les paren­thè­ses ont deux fonc­tions, grou­per des élé­ments entre eux et mémo­ri­ser le con­tenu mat­ché pour le ren­dre réu­ti­li­sa­ble par la suite
  • | : opé­ra­teur OU comme dans “con­fi­ture ou nutella ?”

Exem­ples :

^vive (la confiture|le nutella)$

Main­te­nant les rac­cour­cis :

  • . : n’importe quel carac­tè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 chif­fre
  • w : un carac­tère alpha­nu­mé­ri­que
  • W : un carac­tère non alpha­nu­mé­ri­que
  • s : un carac­tère d’espa­ce­ment
  • S : un carac­tère de non-espa­ce­ment
  • 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 cel­les-ci vous sau­rez vous débrouiller dans la plu­part des situa­tions.

Exem­ples :

# 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 ini­tia­tion sans con­sé­quen­ces, vous pou­vez aller lire la vraie docu­men­ta­tion four­nie en man­page avec la docu­men­ta­tion perl man perlre.

Vus : 243
Publié par Peck : 100