3 conseils pour mieux écrire tes regex !
Table des matières
Il y a quelques semaines, je suis retombé sur cet excellent article de ZeNobral sur les expressions régulières.
Même 4 ans après sa parution (et même à l'heure de ChatGPT !), je le trouve toujours aussi intéressant à lire.
Aujourd'hui, j'aimerais moi aussi te donner 3 conseils pour progresser dans l'écriture des regex.
Utiliser les groupes non capturants : (?:)
Généralement, quand on veut grouper plusieurs éléments, on utilise les parenthèses.
Exemple : l'expression (apple|samsung|huawei)
va matcher à la fois "apple", "samsung" et "huawei".
Le problème, c'est que l'expression entre parenthèses est automatiquement assignée à une variable : elle est dite "capturée".
Or, on n'a pas toujours besoin de capturer ce qui est entre parenthèses.
Et pour faire en sorte de ne pas capturer, il faut utiliser (?:)
.
J'avais d'ailleurs donné un exemple concret sur Twitter l'année dernière, dans un thread sur la fonction Google Sheets REGEXEXTRACT
.
Je le remets ici.
Pour bien voir la différence entre capturant et non capturant, voici ce que ça donne sur l'outil Rubular ⤵️
Utiliser "tout sauf" : [^]
Quand on débute avec les expressions régulières, le réflexe, c'est d'utiliser .*
à toutes les sauces.
Pour rappel, .*
signifie n'importe quel caractère, avec une répétition de 0, 1 ou plusieurs fois.
Or, en réalité on a rarement besoin de viser aussi large. Bien souvent même, ça crée des problèmes.
Je te conseille plutôt de faire l'inverse et d'utiliser sauf via le caractère ^
.
Exemple :
Tu veux capturer uniquement les symboles monétaires dans la liste de prix ci-dessous :
- 19,99 €
- £20.75
- $5
Plutôt que de bricoler une regex avec (.*)
, je te conseille l'expression suivante : ([^0-9.,\s])
.
Ce qui signifie : je veux matcher n'importe quel caractère sauf :
- un chiffre entre 0 et 9
- ou un point
- ou une virgule
- ou un espace
Utiliser les assertions négatives : (?<!) et (?!)
Pour terminer, je vais te parler des assertions négatives.
Encore un mot un peu barbare pour un concept qui n'est en réalité pas si difficile à comprendre.
L'idée, c'est simplement d'indiquer qu'on ne souhaite pas qu'une chaîne de caractères soit précédée (assertion arrière négative) ou suivie (assertion arrière positive) par quelque chose.
Exemple :
Tu veux capturer uniquement les URLs ne contenant pas "www" dans la liste ci-dessous :
- https://www.google.com
- https://developers.google.com
- https://cloud.google.com
Dans ce cas, tu peux utiliser l'expression rationnelle suivante : https?://\S+(?<!www).google.com
.
Ce qui signifie : je veux matcher les URLs :
- commençant par "http://" ou "https://"
- suivi de n'importe quel caractère qui n'est pas un espace, une ou plusieurs fois
- suivi de ".google.com" SAUF s'il est précédé de "www"
Et voilà ! J'espère qu'avec ces quelques conseils, tu seras un peu plus à l'aise avec l'utilisation des regex 😀
- Partager sur Twitter
- Partager sur Facebook
- Partager sur LinkedIn
- Partager sur Pinterest
- Partager par E-mail
- Copier le lien
Un Template Google Sheets Offert ! 🎁
Rejoins ma newsletter et reçois une astuce SEO chaque mercredi ! En cadeau, je t'offre un template Google Sheets avec 50 fonctions de scraping prêtes à l'emploi.