| auteur : Djibril | - Tout caractère alphabétique en minuscule: [a-z]
- Tout caractère alphabétique en majuscule : [A-Z] (il existe des options pour prendre en compte la casse, voir plus loin)
- Tout caractère numérique : [0-9]
- Tout caractère alphanumérique : [a-zA-Z0-9]
|
| auteur : Djibril | Notation | Signification | Equivalent | \n | Un retour chariot. | | \t | Une tabulation. | | ^ | Le caractère spécial "^" a deux significations différentes :
Dans un ensemble [..], il signifie "tout sauf"
En dehors il signifie "commence par" | [^0-9]
/^dji/ | \w | Un caractère alphanumérique, avec le "souligné"
couramment appelé "underscore" ( _ ). | [a-zA-Z0-9_] | \W | Tout sauf un caractère alphanumérique et le souligné ( _ ) compris. | [^a-zA-Z0-9_] | \d | un caractère numérique. | [0-9] | \D | Tout sauf un caractère numérique. | [^0-9] | \s | Un espace. | | \S | Tout sauf un espace. | | $ | Fin de ligne. | /son$/ expression se terminant par "son" | $& | Motif qui correspond à l'expression régulière. | /motif/ (exemple ci-dessous) | $` | Sous ensemble qui se trouve avant $&. | (exemple ci-dessous) | $' | Sous ensemble qui se trouve après $&. | (exemple ci-dessous) | Voici un exemple de script utilisant différents caractères : #!/usr/bin/perl -w
use strict;
use Carp;
my $mon_texte = "Il fera beau d'ici 15 heures 30";
if ($mon_texte =~ /fera/) {
print "$&\n"; #$& = "fera"
print "$`\n"; #$` = "Il ", attention, l'espace est aussi récuperé
print "$'\n"; #$' = " beau d'ici 15 heures 30"
}
if ($mon_texte =~ /\d$/) {
print "$mon_texte\n"; #Il fera beau d'ici 15 heures 30
}
if ($mon_texte =~ /[0-9]$/) { #écriture semblable à la précédente
print "$mon_texte\n"; #Il fera beau d'ici 15 heures 30
}
if ($mon_texte =~ /[a-z]$/) {
print "OK\n";
}
else {
print "Pas de bol\n"; #Pas de bol (car ma chaine ne se termine pas par un caractere alphabétique)
} |
|
| auteur : Djibril | Il s'agit maintenant d'étudier "le langage" des expressions régulières, fondé sur le rôle d'opérateur des métacaractères.
Rappelons qu'il faut les "échapper" avec " \ " pour neutraliser leur action d'opérateurs.
Notation | Signification | . | Représente un caractère quelconque, sauf \n (comportement par défaut, modifiable). | * | Marque la possible répétition du caractère précédent (ou de l'expression précédente entre parenthèses) 0 ou n fois. | + | Marque la répétition du caractère précédent (ou de l'expression précédente entre parenthèses) au MOINS 1 fois. | ? | Marque la possible répétition du caractère précédent (ou de l'expression précédente entre parenthèses) 0 ou 1 fois. | [..] | Recherche L'UN des caractères de l'ensemble des caractères entre crochets. | [^..] | Recherche tout sauf les caractères qui sont entre les crochets. | ^ | La recherche s'effectue en début de chaîne ex : /^regex/. | $ | La recherche s'effectue en fin de chaîne ex : /regex$/. | \ | Annule le rôle de méta-caractère du caractère qui suit, et lui permet d'avoir sa signification usuelle. | | | Joue le rôle de "ou" entre 2 expressions. (ex : /toto|titi/) => toto ou titi. | (...) | Rôle de groupement et de mémorisation de la regex comprise. | {n,m} | Le nombre de répétitions attendu va de n à m (et porte sur le caractère ou l'expression précédent), m et n inférieurs à 65536. | {n} | Le nombre de répétitions attendu doit être exactement égal à n. | {n,} | Le nombre de répétitions attendu est au moins n. | {,m} | Le nombre de répétitions attendu est au plus m. | | {0,} {1,} {0,1} équivalent respectivement à *, + et ? | Résumé : les Metacaractères sont : " ^ | { } [ ] ( ) / \ $ + * ? ."
Exemple sur l'utilisation du "\": #!/usr/bin/perl -w
use strict;
use Carp;
my $chaine = "la/les maison(s) de normandie " ;
#Pour empêcher que Perl interpréte "/ ( )" dans ma chaine comme des métacaractères, on utilise le "\"
if ( $chaine =~ /^la\/les maison\(s\)/) {
print " la ligne est $chaine " ; #=> la/les maison(s) de normandie
} |
|
| auteur : Djibril | Ce sont des symboles dont la présence indique une contrainte de positionnement du motif à la recherche dans le texte.
Nous les avons déjà étudié ci-dessus.
^pipo | La recherche du motif pipo doit être effectuée uniquement en début de chaine | regex$ | recherche du motif regex doit être effectuée uniquement en fin de chaîne. | |
| auteur : Djibril | La présence de parenthèses autour d'une partie d'un motif (qu'on appellera sous motif) est nécessaire pour plusieurs raisons et objectifs :
- Pour marquer un regroupement de plusieurs caractères sur lequel on veut agir, le plus souvent, par la pose d'un quantificateur penser à la différence entre les "mots" papa+ et pa(pa)+.
- Pour signifier le besoin de mémoriser la sous-chaine du texte étudié qui satisfait le sous-motif. On parle pour cette raison de parenthèses de capture. On peut référencer le sous-motif par $1 à $n ($n est une variable spéciale : le contenu de la n ieme parenthèse)
exemple : #!/usr/bin/perl -w
use strict;
use Carp;
my $chaine = "les maisons valent 5000000 euros" ;
if ($chaine =~ /\s(\d+\seuros)$/) {
my $prix = $1;
print "il coute donc $prix\n"; #il coute donc 5000000 euros
} |
|
| auteur : Djibril | Une expression régulière peut être suivie d'options cumulables, qui modifient l'interprétation de l'expression.
Syntaxe : if ($toto =~ /expr/giox) ...
Notation | Signification | i | recherche insensible à la casse (majuscules/minuscules). | g | la recherche est globale, de toutes les occurrences. | x | espaces et sauts de lignes ne comptent pas. | m | traiter la chaîne comme des lignes multiples (^ et $ s'appliqueront à chaque ligne). | s | traiter la chaîne comme une ligne simple (le caractère . reconnaît aussi les sauts de ligne). | o | Compilation du motif uniquement la première fois. | Exemple de script utilisant ces options : #!/usr/bin/perl -w
use strict;
use Carp;
my $chaine = "atgccATCccca";
if ($chaine =~ /[atgcATGC]/) {
print "OK sans utiliser l'option i\n"; #=> OK sans utiliser l'option i
}
if ($chaine =~ /[atgc]/i) {
print "OK avec utiliser l'option i\n"; #=> OK avec utiliser l'option i
}
if ($chaine =~ /(atc)/gi) {
print "motif $1 trouvé\n"; #=> motif ATC trouvé
}
my $mon_texte = "il fait jour\nIl fait nuit\nBonsoir";
if ($mon_texte =~ /jour$/) {
print "$mon_texte\n"; #=> rien
}
if ($mon_texte =~ /jour$/m) {
print "$mon_texte\n"; #=> il fait jour
# Il fait nuit
# Bonsoir
} |
|
| auteur : Djibril | Comme le fait la commande "sed" en Unix, Perl permet de faire des remplacements sur une chaîne de caractères en utilisant
la syntaxe $chaine =~ s/motif/remplacement/; #!/usr/bin/perl -w
use strict;
use Carp;
$fruit =~ s/e$/es/; #remplace un "e" final en "es"
$tel =~ s/01\.12\.22\.44\.99/00\.33\.1\.12\.22\.44\.99/; #remplace les numeros de téléphone par l'équivalent international.
my $arbres = "manguier pommier cerisier";
$arbres =~ s/(\w+)ier/arbres à $1es,/g;
print "liste: $arbres\n"; #=> liste: arbres à mangues, arbres à pommes, arbres à cerises,
$arbres =~ s/,$/./;
print "liste: $arbres\n"; #=> liste: arbres à mangues, arbres à pommes, arbres à cerises. |
Quelques fonctions intéressantes en complément :
tr | Cette commande permet de transformer une chaine en une autre chaine ou de modifier des occurrences dans une chaine. | split | Découpe et range dans une liste les éléments trouvés contenus entre un délimiteur défini. split(délimiteur,$variable); | join | Concatène une valeur à chaque élément d'une liste et range le tout dans une variable. join($valeur,@liste); | # tr
$name =~ tr/A-Z/a-z/; # Transforme toutes les majuscules en minuscules
$name =~ tr/er/ab/; # Transforme les e en a et les r en b
# split
$a = "1:2:3:4::5";
@liste = split(/:/,$a); #=> ("1","2","3","4","","5")
# join
$valeur = "+";
@liste = ("1","2","3","4");
$res = join($valeur,@liste); #=> ("1+2+3+4+") |
|
Consultez les autres F.A.Q's  
|