Developpez.com - Autres
X

Choisissez d'abord la catégorieensuite la rubrique :

Sommaire > Expressions régulières > Classes de caractères
        Un caractère et ensemble de caractères
        Caractères spéciaux et prédéfinies
        Meta caractères et quantificateurs
        Caractères d'ancrages
        Mémorisation (Parenthèses de regroupement et de capture)
        Options, compléments
        Remplacement et substitution

        


Un caractère et ensemble de caractères
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]


Caractères spéciaux et prédéfinies
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) }

Metacaractères et quantificateurs
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 }

Caractères d'ancrages
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.

Mémorisation (Parenthèses de regroupement et de capture)
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 referencer 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 }

Options, compléments
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 occurences.
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 . reconnait 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 }

Remplacement et substitution
auteur : Djibril
Comme le fait la commande "sed" en Unix, Perl permet de faire des remplacements sur une chaine 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 occurences dans une chaine.
split Découpe et range dans une liste les éléments trouvés contenus entre un délimiteur défini. split(delimiteur,$variable);
join Concatene une valeur à chaque element 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

Ce document issu de www.developpez.com est soumis à la licence GNU FDL traduit en français ici
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.
Contacter le responsable de la rubrique Autres