Niveau :      
Résumé : perlre

Suite à l'article précédent, qui posait les bases des expressions régulières, vous êtes probablement resté sur votre faim. Voici quelques astuces permettant d'élever le niveau et de faire des expressions mieux construites, plus rapides, plus courtes ...

Traitement des lignes

Fonctionnalités que tous les outils ne proposent pas, mais qui sont inclues dans le langage PCRE, /m et /s sont des modificateurs comme dans 's/toto/tata/m'.

Il faut bien distinguer les 2 qui portent assez facilement à confusion. De plus les 2 peuvent être utilisées en même temps.

  • /m est utilisé pour changer la syntaxe de '^' et '$' qui habituellement matchent le début et la fin de la chaîne, avec /m ils matcheront le début et la fin de chaque ligne.
  • /s est utilisé pour changer la syntaxe de '.' qui habituellement matche n'importe quel caractère sauf le changement de ligne, avec /s il matchera n'importe quel caractère y compris le changement de ligne

Ces modificateurs ne font la différence que lorsqu'on veut toucher aux caractères de retour à la ligne et plus généralement, lorsqu'on manipule des chaînes de caractère multilignes.

Gloutonnerie

L'algorithme de matching est glouton par défaut, ce qui veut dire que l'expression suivante :

/(.*):/

Marchera tous les éléments qui se trouvent avant le dernier ':' dans

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

On peut désactiver la gloutonnerie (greediness) en utilisant ? :

/(.*?):/

Qui du coup ne matchera plus que le premier élément.

Backreference

Il est possible de référencer un élément capturé à l'intérieur d'une expression régulière, ce qui permet de détecter les répétitions.

Exemple pour matcher le début et la fin d'une balise html.

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

Extensions

Un certain nombre d'extensions d'expressions régulières ont été définies et commencent par '(?' on les utilise peu, mais elles sont très pratiques pour optimiser (en complexité comme en vitesse) des expressions régulières.

Match sans capture

(?:regex)

Permet de matcher sans capturer le contenu dans une variable. Pratique pour éviter la complexité liée à la numérotation des parenthèses imbriquées

Lookahead et lookbehind

Il est possible de matcher des éléments "s'ils sont suivis de" (ou "précédés", ou "ne sont pas"). Ceci permet d'écrire des expressions correspondant beaucoup mieux à la description

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)/

Modificateur inline

Il es possible de changer un modificateur temporairement, par exemple pour rendre le matching insensible à 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 voulez encore plus de fonctionnalités ? Perl 5.10 apporte son lot de nouveautés dans les expressions régulières. Celles sont-ci sont aussi disponibles dans PCRE pour la plupart puisqu'elles en sont inspirées.

Je ne vais pas vous réécrire cet article très bien fait sur le sujet. Ces nouveautés seront surtout utiles pour les utilisateurs avancés.