Soyez régulier (2)

Niveau : Star Star Star Empty Empty
Résumé : perlre

Suite à l’arti­cle pré­cé­dent, qui posait les bases des expres­sions régu­liè­res, vous êtes pro­ba­ble­ment resté sur votre faim. Voici quel­ques astu­ces per­met­tant d’éle­ver le niveau et de faire des expres­sions mieux cons­trui­tes, plus rapi­des, plus cour­tes …

Trai­te­ment des lignes

Fonc­tion­na­li­tés que tous les outils ne pro­po­sent pas, mais qui sont inclues dans le lan­gage PCRE, /m et /s sont des modi­fi­ca­teurs comme dans ‘s/toto/tata/m’.

Il faut bien dis­tin­guer les 2 qui por­tent assez faci­le­ment à con­fu­sion. De plus les 2 peu­vent être uti­li­sées en même temps.

  • /m est uti­lisé pour chan­ger la syn­taxe de ‘^’ et ‘$’ qui habi­tuel­le­ment mat­chent le début et la fin de la chaîne, avec /m ils mat­che­ront le début et la fin de cha­que ligne.
  • /s est uti­lisé pour chan­ger la syn­taxe de ‘.’ qui habi­tuel­le­ment mat­che n’importe quel carac­tère sauf le chan­ge­ment de ligne, avec /s il mat­chera n’importe quel carac­tère y com­pris le chan­ge­ment de ligne

Ces modi­fi­ca­teurs ne font la dif­fé­rence que lorsqu’on veut tou­cher aux carac­tè­res de retour à la ligne et plus géné­ra­le­ment, lorsqu’on mani­pule des chaî­nes de carac­tère mul­ti­li­gnes.

Glou­ton­ne­rie

L’algo­rithme de mat­ching est glou­ton par défaut, ce qui veut dire que l’expres­sion sui­vante :

/(.*):/

Mar­chera tous les élé­ments qui se trou­vent avant le der­nier ‘:’ dans

root:x:0:0:root:/root:/bin/bash

On peut désac­ti­ver la glou­ton­ne­rie (gree­di­ness) en uti­li­sant ? :

/(.*?):/

Qui du coup ne mat­chera plus que le pre­mier élé­ment.

Backre­fe­rence

Il est pos­si­ble de réfé­ren­cer un élé­ment cap­turé à l’inté­rieur d’une expres­sion régu­lière, ce qui per­met de détec­ter les répé­ti­tions.

Exem­ple pour mat­cher le début et la fin d’une balise html.

/<(w+)>.*?</1>/

Exten­sions

Un cer­tain nom­bre d’exten­sions d’expres­sions régu­liè­res ont été défi­nies et com­men­cent par ‘(?’ on les uti­lise peu, mais elles sont très pra­ti­ques pour opti­mi­ser (en com­plexité comme en vitesse) des expres­sions régu­liè­res.

Match sans cap­ture

(?:regex)

Per­met de mat­cher sans cap­tu­rer le con­tenu dans une varia­ble. Pra­ti­que pour évi­ter la com­plexité liée à la numé­ro­ta­tion des paren­thè­ses imbri­quées

Loo­ka­head et look­be­hind

Il est pos­si­ble de mat­cher des élé­ments “s’ils sont sui­vis de” (ou “pré­cé­dés”, ou “ne sont pas”). Ceci per­met d’écrire des expres­sions cor­res­pon­dant beau­coup mieux à la des­crip­tion

qu'on en fait, et parfois même d'écrire ce qui était impossible.
# matche "very funny" et "not boring" mais pas "not funny"
/(w+ )((?<!not )funny|boring)/

Modi­fi­ca­teur inline

Il es pos­si­ble de chan­ger un modi­fi­ca­teur tem­po­rai­re­ment, par exem­ple pour ren­dre le mat­ching insen­si­ble à la casse sur un seul mot :

# seul toto peut être écrit indifféremment avec des majuscules et des minuscules
/Bonjour (?i)toto(?-i) la moule/

Encore plus

Vous vou­lez encore plus de fonc­tion­na­li­tés ? Perl 5.10 apporte son lot de nou­veau­tés dans les expres­sions régu­liè­res. Cel­les sont-ci sont aussi dis­po­ni­bles dans PCRE pour la plu­part puisqu’elles en sont ins­pi­rées.

Je ne vais pas vous réé­crire cet arti­cle très bien fait sur le sujet. Ces nou­veau­tés seront sur­tout uti­les pour les uti­li­sa­teurs avan­cés.

Vus : 221
Publié par Peck : 100