Вы находитесь на странице: 1из 7

3/4/2015

Tutorielpourmatriserlesexpressionsrgulires/regex
PRSENTATION

BLOG

Le blog de Lucas Willems

Suivre

27abonns

Mathmatiques, programmation, conseils

MATHMATIQUES

PROGRAMMATION

PROJECT EULER

CONSEILS

A PROPOS

TAGS

Recherche

Accueil Tutoriaux Tutoriel pour matriser les expressions rgulires / regex

Tutoriel pour matriser les expressions rgulires / regex


13 sept. 2013

Lucas Willems

Tutoriaux

Concept, Regex

Les expressions rgulires, ou plus communment regex (contraction de regular


expression) permettent de reprsenter des modles de chanes de caractre. Ce sont des
outils trs puissants et trs utiliss : on peut les retrouver dans de nombreux langages
comme le PHP, MySQL, Javascript... ou encore dans des logiciels d'dition de code !
Cependant, si cet outil est trs puissant, il est relativement difficile apprhender au dbut
car les expressions rgulires peuvent prendre des formes de ce genre :
#^[azAZ]+@[azAZ]+\.[azAZ]{2,6}$#

Cet expression rgulire permettant, par exemple, de reprsenter toutes les adresses
emails contenues dans un texte. Vous pouvez donc voir que la syntaxe est peu commune et
qu'un petit tutoriel s'impose pour pouvoir comprendre et utiliser le concept des
expressions rgulires. Pour suivre ce tutoriel, il vous faudra utiliser un diteur de code qui
comprend les expressions rgulires : si vous n'en avez pas encore un, vous pouvez
tlcharger et installer notepad++.

ARTICLES SUR LE MME SUJET


Utilisez la rcursivit pour
acclrer vos algorithmes
13 sept. 2013

Crer des logiciels en HTML,


CSS et Javascript avec TideSDK
13 sept. 2013

Sommaire
1 La limite des recherches classiques
2 Regex simple
2.1 Les caractres de dbut et fin de chane

Project Euler 20 : solution


Python du problme Factorial
digit sum 13 sept. 2013

2.2 Le caractres OU
3 Les ensembles de caractres
3.1 Les diffrents ensembles

ARTICLES ALATOIRES

3.2 Les ensembles prconus


4 Les quantificateurs
5 L'chappement
6 Mise en pratique

Project Euler 30 : solution


Python du problme "Digit fifth
powers" 19 nov. 2013

6.1 Vrifier si un numro de tlphone est correcte


6.2 Dtecter les liens et les rendre cliquable

1 La limite des recherches classiques


Pour commencer simplement, ouvrons notre diteur de code et collons y le texte suivant :

Project Euler 23 : solution


Python du problme "Nonabundant sums"
12 nov. 2013

Bonjour et au revoir ! Je m'appelle John Doe, j'ai 27 ans, j'habite en France et travaille
depuis que j'ai 20 ans. Ma passion : crire des mots, mits, mets, mats, mat... Pour me
contacter, vous pouvez envoyer un email contact@johndoe.fr ou
contact@johndoe.com ou bien m'appeler au 06 07 08 09 10. Vous pouvez aussi aller
voir mon blog l'adresse johndoe-blog.fr. Bonjour et au revoir

Project Euler 22 : solution


Python du problme "Names
scores" 11 nov. 2013

Puis, recherchons y, en rendant la recherche sensible la casse (voir image prcdente), le


http://blog.lucaswillems.com/772/tutorielexpressionsregulieresregex

1/7

3/4/2015

Tutorielpourmatriserlesexpressionsrgulires/regex

mot Bonjour. La faon la plus simple est alors de faire un simple Ctrl+F comme on en a
l'habitude : pas besoin d'utiliser les regex. Suite cette recherche, les 2 occurrences de
Bonjour devraient tre slectionn. Normal.
Maintenant, imaginons que nous voulons rechercher, cette fois-ci, seulement le
motBonjourqui se trouve au tout dbut du texte. Comment faire avec un simple Ctrl+F ? Ce
n'est tout simplement pas possible : voici donc la limite des recherches classiques. Pour
faire des recherches plus complexes, il nous faudra utiliser les regex.

2 Regex simple
Reprenons notre recherche du mot Bonjour du dbut de texte, mais cette fois, en utilisant
les regex, et plus particulirement les caractres de dbut et fin de chane.
2.1 Les caractres de dbut et fin de chane
Les caractres de dbut et de fin de chane, respectivement ^ et $, reprsentent, comme
leur nom l'indique, le dbut et la fin de la chane. Donc, si nous retournons dans notre
diteur de code, que nous faisons de nouveau Ctrl+F, que nous activons les expressions
rguliresau passage et que nous entrons dans le champ de recherche la regex suivante :
^Bonjour

L'diteur de code devrait slectionner seulement le mot Bonjour se trouvant au dbut du


texte. Et si nous remplaons la regex que nous venons d'entrer par celle-ci :
revoir$

L'diteur de code devrait slectionner seulement le motrevoir qui se situe la fin du texte.
2.2 Le caractres OU
Imaginons maintenant que nous voulons rechercher, dans le texte, les mots Bonjour
etrevoir, c'est dire le motBonjour OU le motrevoir : nous devrons alors utiliser la barre
verticale |. Ainsi la regex suivante slectionnera toutes les occurrences de Bonjour et
revoir:
Bonjour|revoir

Il est aussi possible de slectionner les occurrences du mot Bonjour se trouvant au dbut
du texte et du motrevoirse trouvant la fin, ce qui revient fusionner, en les sparant par
une barre verticale, les 2 regex vues dans la sous partie prcdente. Voici donc la regex
correspondant :
^Bonjour|revoir$

3 Les ensembles de caractres


Passons maintenant des regex un peu plus complexes, et beaucoup plus puissantes, en
nous attardons sur les ensembles de caractres.
3.1 Les diffrents ensembles
Maintenant, nous voulons chercher dans notre texte, les mots mots, mats et mits. Nous
pourrions trs bien utiliser cette regex :
mots|mats|mits

Mais il y a plus simple et ce grce aux ensembles de caractres qui font office, en quelques
sortes, de OU en plus courts et plus puissants. Un ensemble de caractre est dlimit par
des crochets dans lesquels se trouvent les caractres faisant parti du OU. Ainsi, la regex
http://blog.lucaswillems.com/772/tutorielexpressionsregulieresregex

2/7

3/4/2015

Tutorielpourmatriserlesexpressionsrgulires/regex

suivante :
m[oai]ts

est beaucoup plus succincte que la prcdente et slectionne les mmes mots. Cette regex
peut tre expliciter par la phrase suivante : "Slectionne les parties du texte o il y a un m,
suivi d'un o ou d'un a ou d'un i, suivi d'un t, suivi d'un s." Les ensembles de caractres
permettent aussi d'exclure des caractres grce l'accent circonflexe ^. La regex suivante :
m[^oai]ts

slectionnera, cette fois-ci, seulement le mots mets et peut tre explicite par la phrase
suivante : "Slectionne les parties du texte o il y a un m, suivi d'une lettre qui n'est ni o, ni
a, ni i, suivi d'un t, suivi d'un s." Enfin, imaginons que nous voulons slectionner tous les
mots commenant par un m, suivi de n'importe quelle lettre, suivi d'un t, suivi d'un s. La
regex qui nous viendrait l'esprit serait une regex de ce type :
m[abcdefghijklmnopqrstuvwxyz]ts

La regex serait donc longue et fastidieuse crire, surtout que pour celle-ci, seules les
minuscules ont t slectionnes ! Heureusement, un moyen plus simple existe pour crire
de telles regex : cela s'appelle les intervalles et se note [debut intervalle-fin intervalle].
Voici quelques petites exemples :
Intervalle

Equivalent

Traduction

[a-z]

[abcdefghijklmonpqrstuvwxyz]

Lettres minuscules de a
z

[A-Z]

[ABCDEFGHIJKLMNOPQRSTUVWXYZ]

Lettres majuscules de A
Z

[0-9]

[0123456789]

Chiffres de 0 9

[a-z0-9]

[abcdefghijklmonpqrstuvwxyz0123456789]

Lettres minuscules de a
z ou chiffres de 0 9

Reprenons donc notre regex et utilisons les intervalles. Nous obtenons alors :
m[az]ts

ce qui slectionne le mot metsen plus des motsmots,matsetmits.


3.2 Les ensembles prconus
Un ensemble prconu est une faon trs simple de reprsenter plusieurs intervalles. Voici
quelques exemples :
Ensemble

Equivalent

Absolument n'importe quel charactre

\w

[a-zA-Z0-9_]

\d

[0-9]

\n

Un retour la ligne

\t

Une tabulation

Ainsi, cette regex :


m\wts

slectionnera les mmes lments que celle-ci :


m[azAZ09_]ts

4 Les quantificateurs
Nous venons de voir qu'un ensemble de caractres permet de dfinir de manire trs
simple les valeurs possible d'un caractre. Mais qu'en est-il si l'on dfinir les mmes
valeurs possibles pour plusieurs caractres ? Par exemple, si l'on veut slectionner les
http://blog.lucaswillems.com/772/tutorielexpressionsregulieresregex

3/7

3/4/2015

Tutorielpourmatriserlesexpressionsrgulires/regex

parties du texte o il y a un m, suivi d'un a, suivi de 3 fois n'importe quelle lettre minuscule,
est-on oblig d'utiliser une regex de ce type :
ma[az][az][az]

Non. Il existe une mthode plus simple qui consiste utiliser les quantificateurs : ce sont
des caractres qui indiquent le nombre de rptition du caractre ou de la suite de
caractre qui les prcdent. Le quantificateur, dans sa forme explicite, peut s'crire de 4
faons :
{min,max} : le nombre de rptition varie entre la valeur minimale et la valeur
maximale incluses
{min,} : le nombre de rptition varie entre la valeur minimale incluse et l'infini
{,max} : le nombre de rptition varie entre 0 et la valeur maximale incluse
{nombre} : le nombre de rptition correspond au nombre marqu entre les
accolades
Par exemple, la regex suivante :
[azAZ]{6}

permet de slectionner les parties du texte o il y a 6 lettres conscutives. Celle-ci :


[09]{2,4}

permet de slectionner les parties du texte o il y a entre 2 et 4 chiffres conscutifs.


Comme pour les ensembles de caractres, il existe aussi des quantificateurs prconus. En
voici la liste :
Quantificateur

Traduction

quivalent

0 ou plusieurs rptitions

{0,}

1 ou plusieurs rptitions

{1,}

0 ou 1 rptition

{,1}

5 L'chappement
Reprenons notre texte et imaginons que l'on veuille y slectionner les noms de domaine
des adresse email contact@johndoe.fr et contact@johndoe.com. La regex qui nous
viendrait donc la tte serait la suivante :
johndoe.[az]{2,3}

Et malheureusement, ce n'est pas exactement celle-l, car mme si les 2 noms de domaine
sont bien slectionns, la chane de caractrejohndoe-blol'est aussi.
Ce problme vient alors du point prsent dans la regex car rappelez-vous que le point est
un ensemble de caractres prconus qui reprsente n'importe quel caractre : il peut
reprsenter un a, un 2 mais aussi un tiret. Pour faire comprendre que le point prsent dans
la regex est bien un point et non pas un ensemble de caractres, il nous faut chapper le
point avec le caractre d'chappement qui est le backslash \. Ainsi la regex correcte est la
suivante :
johndoe\.[az]{2,3}

Cet chappement n'est pas seulement valable pour le point, mais pour tous les caractres
qui ont, de base, une valeur diffrente que celle habituelle. En voici la liste : ^ $ \ |{ }[ ]( ) ?
# !+ * .

6 Mise en pratique
Maintenant que vous possdez d'assez bonnes bases pour comprendre et utiliser les
expressions rgulires, il est temps de sortir des simples recherches dans l'diteur de
code et de passer des cas plus pratiques par l'tude de 2 exemples d'utilisation des
regex dans le langage de programmation PHP.
6.1 Vrifier si un numro de tlphone est correcte
Le premier exemple consiste vrifier si un numro de tlphone est correcte. Pour se
faire, imaginons que l'on ait cr, dans une page form.html, un formulaire contenant
http://blog.lucaswillems.com/772/tutorielexpressionsregulieresregex

4/7

3/4/2015

Tutorielpourmatriserlesexpressionsrgulires/regex

plusieurs champs dont un nomm numerodans lequel l'utilisateur saisirait son numro de
tlphone. Une fois le formulaire complt, l'utilisateur cliquerait sur Valider et enverrait
ses donnes vers une page traitement.php dans laquelle on les vrifierait avant de les
entrer dans une base de donne. La partie nous concernant donc est de vrifier la validit
de ce numro de tlphone.
Commenons par la regex et admettons qu'elle permette de rechercher les numros
franais, commenant par 0 ou +33 et possdant 9 chiffres sans compter le 0 ou +33. Ainsi,
voici une criture possible de celle-ci :
(0|\+33)[19](*[09]{2}){4}

Peut-tre venez vous de remarquer l'apparition de parenthses. Celles-ci permettent de


crer des suites (ou groupe) de caractres et de les stocker en mmoire. Ainsi, si, par
exemple, le caractre prcdent un quantificateur est en fait une suite de caractre, ce n'est
pas le caractre prcdent mais la suite de caractre qui sera rpte plusieurs fois. Voici
maintenant ce que donne le code PHP entier comprenant la regex :
<?php
$numero=$_POST['numero'];
if(preg_match('#(0|\+33)[19](*[09]{2}){4}#',$numero)){
echo"Lenumrodetlphoneentrestcorrect.";
//Onpeutajouterlenumrolabasededonne
}else{
echo"Lenumrodetlphoneentrestincorrect.";
//Onnepeutpasajouterlenumrolabasededonne
}
?>

L aussi, 2 remarques sont faire sur ce code :


la fonctionpreg_matchfait son apparition: celle-ciprend en paramtre la regex ainsi
que le texte dans lequel chercher et retourne true si la chane a t trouve dans le
texte, false sinon.
l'ajout d'un dise # avant et aprs notre regex. Celui, pas forcment un dise, permet
de dlimiter le dbut et la fin de notre regex, et ainsi, offre la possibilit d'ajouter,
aprs le caractre marquant la fin de la regex, des options de recherchecomme, par
exemple, unipermettant de rendre une regex insensible la casse
6.2 Dtecter les liens et les rendre cliquable
Passons maintenant au second exemple qui est aussi assez pratique et qui consiste
dtecter la prsence d'url dans un texte et les convertir en liens cliquables. Imaginons
que le contexte soit le mme que celui de l'exemple prcdent et que, en plus de saisir son
numro de tlphone, l'utilisateur saisisse du texte pouvant contenir des url. Cette fois-ci,
la partie nous intressant consiste rechercher ces url dans le texte et les transformer en
liens cliquables.
Pour commencer, dfinissons la forme que peuvent prendre les url. Celles-ci
commenceront par http ou https, seront suivies de ://, suivies des sous-domaines et du
nom de domaine, ne contenant que des chiffres, lettres, tirets et points et une extension de
2 4 caractres, suivies enfin du chemin d'accs (facultatif) comprenant tous les caractres
sauf l'espace. Voici donc une regex possible pour rechercher des url :
https?://[azAZ09\.]+\.[azAZ]{2,4}(/\S*)?

o \S signifie tout sauf l'espace et o, petit rappel, le ? permet de rendre facultatif le


caractre le prcdent. Voici maintenant le code entier :
<?php
$message=$_POST['message'];
$message=preg_replace(
'#https?://[azAZ09\.]+\.[azAZ]{2,4}(/\S*)?#',
'<ahref="$0"target="_blank">$0</a>',
$message
);
echo$message;
?>

Comme dans l'exemple prcdent, vous avez pu remarquer l'apparition d'une nouvelle
http://blog.lucaswillems.com/772/tutorielexpressionsregulieresregex

5/7

3/4/2015

Tutorielpourmatriserlesexpressionsrgulires/regex

fonction, preg_replace, permettant de remplacer des caractres dans un texte en utilisant


les regex. Celle-ci prend en paramtre la regex, la chane de remplacement, et le texte
contenant les chanes remplacer, et retourne le texte une fois les remplacements
effectus.
Vous avez aussi pu remarquer la prsence de $0 (appeles rfrence) dans le second
paramtre de cette fonction. Ces rfrences correspondent au texte satisfaisant toute la
regex. D'autres rfrences existent comme $1, $2, $3... qui, elles, correspondent au texte
satisfaisant la premire parenthse de la regex, la seconde, la troisime... Si vous n'avez
pas bien compris le fonctionnement de ces rfrences, je vous conseille de bien regarder
les exemples donnes dans la documentation PHP de cette fonction.
Le tutoriel touche sa fin. J'espre qu'il vous aura permis de comprendre le
fonctionnement des expressions rgulires et d'en acqurir de bonnes bases. N'hsitez pas
aussi me donner votre avis en laissant un commentaire ou en m'envoyant un mail.

Recherches relatives cet article :


tutoriel regex
regex telephone
regex numro de tlphone

12Commentaires
Recommend

LeblogdeLucasWillems

Partager

S'identifier

Lesplusrcents

Participerladiscussion
jige23 ilya20jours

BonjourLucas,mercipourcenouveau"tuyau"quifonctionneparfaitement,voilun
blogquejeconseillevivementauxutilisateursamateursdeformulairespourleurs
associations...ouautres!BonWE.

Rpondre Partager

LucasWillems

Modo >jige23

ilya20jours

Derienetmercibeaucouppourtongentilmessage!

Rpondre Partager

jige23 ilya21jours

Lucas,dsoldetedranger,pourlenomc'estbontuasrpondumonproblme,
maispourlechamp"Prnom"jesaisfairepourlapremirelettredelachaneen
majuscule,maisavecunprnomcomposdugenre"MarieLouise",ledeuxime
motn'estpasprisencompte!Commentadapterle"regex"lapremirelettrede
chacundesmotsdelachane?Mercid'avance!

Rpondre Partager

LucasWillems

Modo >jige23

ilya20jours

D'accord.
Tupeuxtestercetteregex:^((\b[AZ][az]+)([\s]*))+$
Elleregardesilachainedecaractreestunesuccessiondemots,spars
parunespaceouuntiret,commenantparunemajuscule.

Rpondre Partager

jige23 ilya21jours

Bonjour,mercipourcetterponserapide,jenevoudraispaspasserpourunem.......,
maispourlechamp"Prnom"j'aiutilisle"regex"suivant:^[AZ]{1}leproblmec'est
quec'estvalablequepourlapremirelettredelachaneetneprendpasencompte
chaquepremirelettredechaquemot!

Rpondre Partager

LucasWillems

Modo >jige23

ilya21jours

Queveuxtuexactement?Tuveuxquetoutesleslettressoientenmajuscule
oujustela1relettredechaquemot?

Rpondre Partager

http://blog.lucaswillems.com/772/tutorielexpressionsregulieresregex

6/7

3/4/2015

Tutorielpourmatriserlesexpressionsrgulires/regex
jige23 ilya22jours

Bonjourtous,noviceenlamatire,jerecherchelasolution(leregex)quipermettrait
d'imposerlasaisied'unmotenmajusculesdansunformulaire"Google"!Merci!

Rpondre Partager

LucasWillems

Modo >jige23

ilya21jours

TupeuxutiliserlesRegexdanslesformulairesGoogle?
Sic'estlecas,tupeuxutiliserleRegexsuivant:
^[^az]+$
Quicorrespondlachainesansaucuneminiscule,maislesautres
caractres(espace...)sontautoriss.

Rpondre Partager

olivier ilya2mois

Enfindesexplicationsclairesetconcisessurlesregex.Merci++

Rpondre Partager

LucasWillems

Modo >olivier

ilya2mois

MercibeaucoupOlivier.Contentquemonarticleaitput'aider.

Rpondre Partager

JeanCharlesGautard ilya5mois

Merci!
Vousabordeztoutcequim'atessentiel:)

Rpondre Partager

LucasWillems

Modo >JeanCharlesGautard

ilya2mois

Mercibeaucouppourvotrecommentairequimefaittrsplaisir!

S'abonner

Rpondre Partager

AjoutezDisqusvotresiteweb!

ViePrive

Ralis par Lucas Willems.

http://blog.lucaswillems.com/772/tutorielexpressionsregulieresregex

7/7