Les quantificateurs



Les quantificateurs sont des symboles qui permettent de dire combien de fois peuvent se répéter un caractère ou une suite de caractères.
Par exemple, pour reconnaître une adresse e-mail comme francois@free.fr, il va falloir dire : « Elle commence par une ou plusieurs lettres, suivie(s) d'une @ (arobase), suivie de deux lettres au moins, elles-mêmes suivies d'un point, et enfin de deux à quatre lettres (pour le .fr.com, mais aussi .info (Eh oui, ça existe !).


Bon : pour le moment, notre but n'est pas d'écrire une regex qui permet de savoir si l'adresse e-mail rentrée par le visiteur a la bonne forme (c'est encore trop tôt). Mais tout ça pour vous dire qu'il est indispensable de savoir indiquer combien de fois une lettre peut se répéter !


Les symboles les plus courants


Vous devez retenir trois symboles :

  • ? (point d'interrogation) : ce symbole indique que la lettre est facultative. Elle peut y être 0 ou 1 fois.

Ainsi, #a?# reconnaît 0 ou 1 « a » ;

  • + (signe plus) : la lettre est obligatoire. Elle peut apparaître 1 ou plusieurs fois.

Ainsi, #a+# reconnaît « a », « aa », « aaa », « aaaa », etc. ;

  • * (étoile) : la lettre est facultative. Elle peut apparaître 0, 1 ou plusieurs fois.

Ainsi, #a*# reconnaît « a », « aa », « aaa », « aaaa », etc. Mais s'il n'y a pas de « a », ça fonctionne aussi !


Notez que ces symboles s'appliquent à la lettre se trouvant directement devant. On peut ainsi autoriser le mot « chien », qu'il soit au singulier comme au pluriel, avec la regex  #chiens?# (fonctionnera pour « chien » et « chiens »).


Vous pouvez donc autoriser la répétition d'une lettre. Je viens de vous montrer le cas pour « chien ». Mais on peut aussi s'en servir pour une lettre au milieu du mot, comme ceci :

#bor?is#

Ce code reconnaîtra « boris » et « bois » !


Et si je veux que ce soient deux lettres ou plus qui se répètent, comment je fais ?


Il faut utiliser des parenthèses. Par exemple, si on veut reconnaître « Ayayayayayay » (le cri de guerre de Speedy Gonzales !), on devra taper la regex suivante :

#Ay(ay)*#
Ce code reconnaîtra « Ay », « Ayay », « Ayayay », « Ayayayay », « Ouïe Aïe Aïe » (non, je rigole pour le dernier).


Vous pouvez utiliser le symbole « | » dans les parenthèses. La regex #Ay(ay|oy)*# renverra par exemple vrai pour « Ayayayoyayayayoyoyoyoyayoy » ! C'est le « ay » OU le « oy » répété plusieurs fois, tout simplement !

Autre bonne nouvelle : vous pouvez mettre un quantificateur après une classe de caractères (vous savez, avec les crochets !). Ainsi #[0-9]+# permet de reconnaître n'importe quel nombre, du moment qu'il y a au moins un chiffre !

Faisons quelques tests pour bien rentrer ça dans nos têtes (tableau suivante).


Chaîne

Regex

Résultat

eeeee

#e+#

VRAI

ooo

#u?#

VRAI

magnifique

#[0-9]+#

FAUX

Yahoooooo

#^Yaho+$#

VRAI

Yahoooooo c'est génial !

#^Yaho+$#

FAUX

Blablablablabla

#^Bla(bla)*$#

VRAI


Les derniers exemples sont très intéressants. La regex #^Yaho+$# signifie que la chaîne doit commencer et finir par le mot « Yahoo ». Il peut y avoir un ou plusieurs « o ». Ainsi « Yaho », « Yahoo », « Yahooo », etc. marchent… Mais vous ne devez rien mettre avant ni après, car j'ai indiqué que c'était un début ET une fin de chaîne avec ^ et $.

Enfin, la dernière regex autorise les mots « Bla », « Blabla », « Blablabla », etc. Je me suis servi des parenthèses pour indiquer que « bla » peut être répété 0, 1 ou plusieurs fois.

Ça commence à faire mal à la tête, n'est-ce pas ?


Être plus précis grâce aux accolades


Parfois on aimerait indiquer que la lettre peut être répétée quatre fois, ou de quatre à six fois… bref, on aimerait être plus précis sur le nombre de répétitions.
C'est là qu'entrent en jeu les accolades. Vous allez voir : si vous avez compris les derniers exemples, ça va vous paraître tout simple.

Il y a trois façons d'utiliser les accolades.

  • {3} : si on met juste un nombre, cela veut dire que la lettre (ou le groupe de lettres s'il est entre parenthèses) doit être répétée 3 fois exactement.
    #a{3}# fonctionne donc pour la chaîne « aaa ».
  • {3,5} : ici, on a plusieurs possibilités. On peut avoir la lettre de 3 à 5 fois.
    #a{3,5}# fonctionne pour « aaa », « aaaa », « aaaaa ».
  • {3,} : si vous mettez une virgule, mais pas de 2e nombre, ça veut dire qu'il peut y en avoir jusqu'à l'infini. Ici, cela signifie « 3 fois ou plus ».
    #a{3,} fonctionne pour « aaa », « aaaa », « aaaaa », « aaaaaa », etc. Je ne vais pas tous les écrire, ça serait un peu long.


Si vous faites attention, vous remarquez que :

  • ? revient à écrire {0,1} ;
  • + revient à écrire {1,} ;
  • * revient à écrire {0,}.


On se fait quelques exemples, histoire de se dire qu'on est prêts (tableau suivant) ?


Chaîne

Regex

Résultat

eeeee

#e{2,}#

VRAI

Blablablabla

#^Bla(bla){4}$#

FAUX

546781

#^[0-9]{6}$#

VRAI


Voilà un sacré paquet d'ingurgité, dites-moi !
Allez, on va s'arrêter là et faire une bonne pause parce que… dans le prochain chapitre, on mélange tout ce qu'on vient d'apprendre !


En résumé

   

  • Les expressions régulières sont des outils de recherche et de remplacement de texte très avancés qui permettent d'effectuer des recherches très précises, pour vérifier par exemple que le texte saisi par l'utilisateur correspond bien à la forme d'une adresse e-mail ou d'un numéro de téléphone.
  • La fonction preg_match vérifie si un texte correspond à la forme décrite par une expression régulière.
  • Une expression régulière est délimitée par un symbole (par exemple le dièse #).
  • Les classes de caractères permettent d'autoriser un grand nombre de symboles (lettres et chiffres) selon un intervalle.
  • Les quantificateurs permettent d'exiger la répétition d'une chaîne de texte un certain nombre de fois.

Créé avec HelpNDoc Personal Edition: Protégez vos PDF contre les accès non autorisés grâce à ces mesures de sécurité