Expression régulière
Niveau :
Résumé : test d'expression régulière
Vous essayez de développer une expression régulière mais vous ne savez pas pourquoi ça ne marche pas ?
Tester une expression
Je vous propose le petit programme suivant qui vous aidera dans la compréhension du fonctionnement de votre regex. Son usage est simple :
./regtest.pl <regex> <chaine>
Exemple :
./regtest.pl "(\d+7)\.1\." "127.127.1.12" 127.127.1.12 : \d+ 127.127.1.12 : \d+7 127.127.1.12 : (\d+7) 127.127.1.12 : (\d+7)\.1\. 127 : $1
Le programme découpe l'expression en éléments syntaxiquement corrects et les applique à la chaine pour voir ce qui matche et le met en évidence. A la fin la liste des groupes qui ont matchés est affiché.
Il est aussi possible de remplacer une des paramètres (la chaine ou la regex) par un '-'. Le programme boucle alors sur l'entrée et vous permet d'entrer une ligne à chaque fois. Vous pouvez donc faire un test en continu. L'avantage et surtout pour les regexp, cela permet de s'affranchir des caractères spéciaux qui pourraient être interprétés par le shell.
Notez que vous aurez besoin de Regexp::Parser qui n'est pas installé par défaut. Pour cela le plus simple est de se connecter en root puis de faire
$ perl -e shell -MCPAN install Regexp::Parser
Et oula, maintenant plus de problème, vous pouvez tester vos expression régulières facilement !
Comment ca marche ?
En écrivant ce petit programme, voici quelques petites astuces que j'ai utilisé.
Écrire en couleur dans le terminal de façon portable :
use Term::ANSIColor; print colored("string", 'red');
Parser une expression régulière perl dans une structure lisible (arbre) :
use Regexp::Parser; my $parser = Regexp::Parser->new; $parser->parse($reg);
Récupérer 3 parties d'une chaine lors d'un matching :
- $` : avant le match
- $& : tout le match
- $' : après le mach
Récupérer les position des éléments matchés et des groupes dans la chaine en question :
- @- : tableau des positions de début de chaque groupe
- @+ : tableau des positions de fin de chaque groupe