PROJET AUTOBLOG


le hollandais volant

Site original : le hollandais volant

⇐ retour index

Petite introduction aux REGEX

samedi 20 décembre 2014 à 21:42
Si vous n’avez jamais programmé, ou si vous débutez tous juste, alors peut-être avez-vous envie de savoir ce que sont les regex.

Le mot regex est une contraction d’un terme anglophone qui se traduit par « expression régulière ». Une expression régulière est en réalité une suite de caractères (i.e. une expression) dont le format est connu, bien précis (i.e. régulier).

Si je dis que je veux une phrase composée de 3 mots séparés par des espaces et possédant 2, 5 et 4 lettres, alors j’ai crée une expression régulière : le format de la phrase étant connu et bien précis.
Une telle phrase pouvant être aussi bien « Il court vite » ou « je mange bien », car ces deux phrases satisfont l’expression régulière « 3 mots de 2, 5 et 4 lettres ». Cette expression régulière marcherait aussi sur « le chat mange », car il n’est pas écrit que la taille des mots doit être dans un ordre précis (même s’il est tout à fait possible d’en faire une avec cette condition).

Un autre exemple, déjà plus concret, c’est par exemple l’expression régulière « 5 groupes de 2 chiffres, séparés du suivant par un tiret ». Vous devinez ce que représente cette expression ? C’est un numéro de téléphone comme « 01-12-23-34-45 ».

Là où ça devient très amusant, c’est quand on doit dire à l’ordinateur qu’un numéro de téléphone peut être composés de groupes de chiffres séparés par des tirets ou des espaces ou des points ! Les regex permettent de telles actions. Ils permettent même de détecter si le numéro commence par 06 (un portable), 08 (un numéro surtaxé) ou un numéro étranger !

En programmation, on a souvent recourt des expressions régulières. Par exemple, il n’est pas rare que les liens que vous cliquez sur une page web sont produits par des regex : le programme qui génère la page cherche les liens en appliquant l’expression régulière « une suite de caractères qui commence par “http://” ou “https://” ».

Évidemment, les expressions régulières dans un programme ne sont pas des phrases comme « 5 groupes de 2 chiffres, chaque groupe est séparés du suivant par un tiret », mais on écrira plutôt ça :
([0-9]{2}-){5}

Si on analyse ce bout de code, on voit effectivement [0-9], qui correspond au fait qu’on cherche des chiffres de 0 à 9, le {2} qui correspond au fait qu’on cherche des chiffres deux par deux, le tiret, qui désigne le tiret après un groupe de deux chiffres, et le {5} qui signifie qu’on cherche 5 fois un groupe de deux chiffres suivi d’un tiret.
En réalité, cette regex ne marchera pas sur 01-12-23-34-45, car le dernier groupe n’est pas suivi d’un tiret. On écrira plutôt ceci :
([0-9]{2}-){4}[0-9]{2}
(qui signifie « 4 groupes de deux chiffres + un tiret, et un groupe de deux chiffres à la fin, sans tiret »).

Comme on peut le constater, les regex deviennent rapidement compliquées à lire. En général, le programmeur commence par en écrire une partie et ajoute des morceaux au fur à mesure qu’il écrit sa regex, tout comme on écrit la phrase « 5 groupes de 2 chiffres, chaque groupe est séparés du suivant par un tiret » : on commence par traduire le terme « chiffres », puis on dit « en fait, il y en a deux », puis « je veux aussi un tiret », et enfin « je veux tout ça 5 fois de suite ».

Les regex permettent de détecter des choses (des numéros de téléphone dans une page, par exemple). Il permet à l’ordinateur de mettre un sens sur une suite de caractères (il sait que tout ce qui correspond à 5 groupes de 2 chiffres est un numéro de téléphone, et peut, si on lui ordonne, les rendre cliquables pour appeler le numéro en question).
Les regex sont utilisés partout, dans pratiquement tous les logiciels : Word arrive à souligner les liens, Firefox lit le code source de la page avec un parseur, qui contient des milliers de regex, VLC utilise également ça pour les fichiers de sous-titres, et tous les sites web : un site qui demande un numéro de téléphone ou une adresse email sait si ce numéro est correct ou pas grâce aux regex.


Tout ceci n’est qu’une petite introduction aux expressions régulières, destinée aux débutants. Si vous vous lancez là dedans vous verrez rapidement que les possibilités sont énormes, mais également de toute la complexité des expressions représentant une regex.
Vous saurez alors dire à quoi sert ceci :
[a-z]{1,}@[a-z]{1,}\.[a-z]{1,3}
(ça détecte les emails du format simpliste « nomprenom@site.fr » — cette regex est à bannir cependant, car elle interdit des adresses avec des chiffres, des majuscules ou bien d’autres adresses valides…) ; ou bien ceci :
#<\s*/?\s*([a-zA-Z0-9-]+)(?: ((?:\s*\w+=(['\"]?)(?:(?!\g{3}).|(?:(?<=\\\)\g{3}))+\g{3})|(?:\s*[\w-\d]+=[^ >/]+))*(?:[\s\w\s]*))*/?>#S
(qui je l’avoue est vraiment très compliquée, mais qui détecte des choses simples : des attributs dans les balises HTML.

Quelques liens d’aide :