Soyez régulier (2)
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 astuce 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 pratique 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 suivi de” (ou “précédé”, ou “ne sont pas”). Ceci permet d’écrire des expression correspondant beaucoup mieux à la descriptions 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.