Le Hollandais Volant

Petite introduction aux REGEX

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 signifie « 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 par exemple 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 les mots doivent ê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 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 en français, mais plutôt du code de ce style là :

([0-9]{2}-){5}

Si on analyse ce bout de code, on voit :

  • le [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 donc plutôt ceci :

([0-9]{2}-){4}[0-9]{2}

Qui signifie alors « 4 groupes de 2 chiffres suivis d’un tiret, et enfin 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, 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 portions de texte dans un texte plus grand (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 veut, les enregistrer dans le carnet d’adresse.

Les regex sont utilisées dans pratiquement tous les logiciels : Word arrive à détecter 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, ainsi que bien-sûr 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 « nom@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 :

  • Regexper, qui permet de dessiner graphiquement ce que font les regex, par exemple pour le numéro de téléphone : http://www.regexper.com/#%28[0-9]{2}-%29{5} ;
  • Regulex, même genre que Regexper (le même outil est également hébergé chez moi, si vous avez peur d’aller dehors :p) ;
  • un mémo sur les regex ;
  • un autre mémo, celui du site-du-zero.
  • la Regex complète pour valider les emails, toutes les emails, rien que les emails ;
  • une regex étonnement simple pour tester si un nombre est premier ;
  • une page que les références arrière/avant dans les regex (c’est un domaine assez avancé des regex) ;
  • HiFi Regex Tester : un outil en ligne pour tester en temps réel le résultat d’une regex quelconque sur un texte quelconque ;
  • un jeu style Sudoku avec des regex.