Publié le · 10 min de lecture
Regex pour non-développeurs : un guide pratique
Un tutoriel regex amical, sans jargon, pour rédacteurs, analystes, marketeurs, et tous ceux qui vivent dans Rechercher et Remplacer. Apprenez la syntaxe qui compte et piquez dix recettes prêtes à l'emploi.
Pourquoi un non-développeur devrait s'intéresser aux regex
Si vous avez déjà ouvert la boîte Rechercher et remplacer dans Word, Google Docs, Notion, un tableur ou votre éditeur de texte préféré en pensant « il doit y avoir un moyen plus rapide de faire ça », vous êtes exactement le bon lecteur pour ce guide. Regex, abréviation de regular expression, est un petit langage de motifs qui transforme Rechercher et remplacer d'un instrument grossier en scalpel. Au lieu de chercher un mot fixe unique, vous décrivez la forme de ce que vous cherchez : « n'importe quel numéro de téléphone », « toute ligne qui commence par une date », « toutes les adresses e-mail dans cet export en désordre ».
Les regex ont la réputation d'être intimidantes, principalement parce que les tutoriels écrits pour programmeurs vous balancent vingt symboles dans le premier paragraphe. La vérité est que vous pouvez être extrêmement productif avec une dizaine de caractères et une poignée de motifs. Cet article vous fait parcourir ce noyau, puis vous tend dix recettes à copier-coller que vous pouvez glisser dans la boîte Rechercher et remplacer de presque toute application moderne dès aujourd'hui.
Petite note sur les endroits où les regex fonctionnent : elles sont prises en charge dans Microsoft Word (avec « Utiliser les caractères génériques » ou via la nouvelle recherche regex), Google Docs (« Correspondance par expressions régulières »), Notion (limité), VS Code, Sublime Text, BBEdit, Obsidian, Google Sheets via REGEXMATCH et REGEXREPLACE, Excel via Power Query et les nouvelles fonctions REGEX, et à peu près tout éditeur de code et outil de test en ligne. Certaines applications utilisent des dialectes légèrement différents, mais quatre-vingt-dix pour cent de ce que vous apprenez ici fonctionne partout.
Qu'est-ce qu'une regex au juste ?
Une expression régulière est un motif. Vous donnez le motif à un moteur de recherche, et il vous renvoie chaque morceau de texte qui correspond à ce motif. La regex la plus simple possible est un mot littéral. Le motif chat trouve les lettres c, h, a, t dans cet ordre. Jusque-là, rien de palpitant, c'est juste du Rechercher et remplacer normal.
La magie commence quand vous mélangez des caractères spéciaux appelés métacaractères. Ils ne se correspondent pas eux-mêmes ; ils décrivent des catégories ou des règles. Un point, par exemple, signifie « n'importe quel caractère unique ». Le motif c.t correspond maintenant à cat, cot, cut, c5t, et même c#t. Soudain, un seul motif fait le travail de dizaines de recherches.
C'est tout le modèle mental. Une regex est une chaîne littérale de texte où certains caractères sont promus pour signifier quelque chose de plus général. Apprenez ce que font ces caractères promus et vous pouvez lire et écrire presque tout motif que vous rencontrez.
Les briques à mémoriser
- . (point) correspond à n'importe quel caractère unique sauf un saut de ligne.
- * signifie « zéro ou plus de la chose précédente ». Donc a* correspond à une chaîne vide, a, aa, aaa, et ainsi de suite.
- + signifie « un ou plus de la chose précédente ». a+ correspond à a, aa, aaa, mais pas à une chaîne vide.
- ? signifie « zéro ou un », c'est-à-dire optionnel. colou?r correspond à la fois à color et colour.
- ^ ancre le motif au début d'une ligne. ^Hello trouve Hello uniquement quand il commence une ligne.
- $ ancre à la fin d'une ligne. \.$ trouve toute ligne qui se termine par un point.
- [abc] est une classe de caractères. Il correspond à un caractère qui est a, b ou c. [a-z] correspond à toute lettre minuscule, [0-9] à tout chiffre, [A-Za-z0-9] à toute lettre ou chiffre.
- [^abc] avec un accent circonflexe à l'intérieur des crochets signifie « tout caractère sauf a, b ou c ».
- \d est l'abréviation de tout chiffre, \w de tout caractère de mot (lettres, chiffres, tiret bas), \s de tout espace blanc (espace, tabulation, saut de ligne). Leurs équivalents en majuscules \D, \W, \S signifient l'inverse.
- Les parenthèses ( ) créent un groupe, à la fois pour appliquer des quantificateurs à plusieurs caractères à la fois et pour capturer du texte que vous voulez réutiliser dans un remplacement.
- La barre verticale | signifie OU. cat|dog correspond à cat ou dog.
- Une barre oblique inverse \ échappe un caractère spécial pour qu'il corresponde littéralement. Pour trouver un véritable point, écrivez \. Pour trouver une parenthèse littérale, écrivez \(.
Ancres, quantificateurs et le piège glouton
Les ancres (^ et $) sont le secret pour écrire des motifs précis. Sans elles, votre regex flotte n'importe où dans le texte et tend à correspondre à plus que vous ne le vouliez. Avec elles, vous épinglez le motif au début ou à la fin d'une ligne, ce qui est généralement exactement ce que vous voulez dire quand vous dites « toute ligne qui commence par un nombre ».
Les quantificateurs (*, +, ? et la forme à accolades comme {2,4}) contrôlent combien de fois la chose précédente se répète. La chose à savoir est qu'ils sont gloutons par défaut : ils saisissent autant qu'ils peuvent. Si vous écrivez <.+> et l'exécutez sur le texte <b>hi</b>, vous pourriez vous attendre à ce qu'il corresponde à <b> et </b> séparément. Il correspondra en fait à tout <b>hi</b> en un seul coup parce que + est glouton. Ajoutez un point d'interrogation, <.+?>, et le quantificateur devient paresseux, correspondant aussi peu que possible. Cette seule astuce épargne énormément de temps de débogage.
Groupes et références arrière pour rechercher-remplacer
Les parenthèses ont un double rôle. Premièrement, elles vous permettent de quantifier un morceau : (ab)+ correspond à ab, abab, ababab. Deuxièmement, et bien plus utile, elles capturent ce qu'elles correspondent dans un emplacement numéroté auquel vous pouvez vous référer dans le champ de remplacement. Le premier jeu de parenthèses devient $1 dans la plupart des éditeurs (ou \1 dans certains), le second devient $2, et ainsi de suite.
C'est ainsi que vous réordonnez du texte. Supposons que votre tableur ait des noms écrits sous la forme Nom, Prénom et que vous vouliez Prénom Nom. Cherchez ([A-Za-z]+), ([A-Za-z]+) et remplacez par $2 $1. Fait, en un seul coup, sur des milliers de lignes. Presque toutes les recettes plus loin dans cet article utilisent la même astuce, donc cela vaut la peine de se familiariser avec l'idée : parenthèses à gauche, dollar-numéros à droite.
Recette 1 : extraire toutes les adresses e-mail d'un texte en désordre
Les adresses e-mail sont omniprésentes dans les exports, les blocs de signature et les vidages CRM. Ce motif est un défaut sensé. Il n'est pas parfait selon la RFC (aucune regex ne l'est vraiment), mais il attrape toute adresse réaliste dans des documents normaux.
[\w.+-]+@[\w-]+\.[\w.-]+Recette 2 : trouver les numéros de téléphone dans tout format courant
Les numéros de téléphone sont un magnifique exemple de la façon dont la regex dompte les entrées en désordre. Le motif ci-dessous attrape les numéros écrits comme 555-123-4567, (555) 123 4567, +1 555.123.4567, et la plupart des variantes intermédiaires. Ajustez le + initial et le code pays si vous n'avez besoin que des numéros locaux.
\+?\d{1,3}?[\s.-]?\(?\d{2,4}\)?[\s.-]?\d{3,4}[\s.-]?\d{3,4}Recette 3 : changer le format de date d'AAAA-MM-JJ à JJ/MM/AAAA
C'est le mouvement classique groupes-et-références-arrière. Capturez chaque partie de date, puis réordonnez-la dans le champ de remplacement. Dans le champ Rechercher, collez le motif ci-dessous ; dans le champ Remplacer, collez $3/$2/$1.
(\d{4})-(\d{2})-(\d{2})Recette 4 : supprimer toutes les lignes vides d'un document
Le texte long collé arrive souvent avec des lignes vides supplémentaires qui doublent ou triplent le nombre de pages. Le motif ci-dessous correspond à une ligne qui ne contient rien d'autre qu'un espace blanc optionnel et un saut de ligne. Remplacez par rien (laissez le champ Remplacer vide) et votre document s'effondre en lignes à interligne simple.
^\s*\nRecette 5 : réduire les espaces doubles, triples ou en série en un seul
Les exports OCR, les PDF copiés et les vieux documents Word sont notoires pour saupoudrer des espaces doubles entre les mots. Trouvez deux espaces consécutifs ou plus et remplacez par un seul espace.
{2,}Recette 6 : extraire toutes les URL d'un bloc de texte
Besoin d'attraper tous les liens d'un article, d'un export e-mail ou d'un journal de chat ? Ce motif attrape les URL http et https, y compris chemins et chaînes de requête. Combinez-le avec la fonctionnalité « copier toutes les correspondances » de votre éditeur, ou collez les correspondances capturées dans un nouveau document.
https?://[\w.-]+(?:/[\w./?=&%#-]*)?Recette 7 : mettre en majuscule la première lettre de chaque nom dans une liste
Si vous avez une colonne pleine de noms tapés en minuscules (jane doe, mark twain), vous pouvez corriger la casse en deux passages. D'abord, trouvez le motif ci-dessous et capturez la première lettre de chaque mot. La plupart des éditeurs vous permettent ensuite de remplacer par \u$1 (mettre en majuscule la première capture). Si le vôtre ne le permet pas, faites passer la liste dans un convertisseur de casse dédié et ramenez-la. Multilities embarque un petit convertisseur de casse qui gère cela en un clic.
\b([a-z])Recette 8 : ne garder que les lignes contenant un nombre
Certains éditeurs vous permettent de supprimer toute ligne qui ne correspond pas à une regex. Combiné au motif ci-dessous, vous pouvez réduire un long fichier de log ou un document de notes aux seules lignes contenant un nombre, ce qui est merveilleux pour nettoyer des relevés bancaires collés depuis un PDF.
^.*\d+.*$Recette 9 : standardiser les espaces blancs en fin de chaque ligne
Les espaces de fin sont invisibles mais ils cassent les outils de diff, les signatures e-mail et les commentaires de code. Trouvez-les et remplacez par rien. Le motif correspond à un ou plusieurs espaces ou tabulations qui se trouvent immédiatement avant la fin d'une ligne.
[ \t]+$Recette 10 : extraire les hashtags d'un export de réseau social
Les équipes marketing exportent des tweets, posts LinkedIn et légendes Instagram et veulent compter quels hashtags sont apparus. Le motif ci-dessous trouve un # immédiatement suivi d'un ou plusieurs caractères de mot, ce qui attrape tout hashtag réaliste sans entraîner la ponctuation environnante.
#\w+Comment essayer concrètement ces motifs dans votre outil
Dans Google Docs, ouvrez Édition, puis Rechercher et remplacer, et cochez « Correspondance par expressions régulières ». Dans Microsoft Word, ouvrez la boîte de dialogue Rechercher et remplacer, développez-la et cochez « Utiliser les caractères génériques » (le dialecte de caractères génériques de Word est similaire mais pas identique, donc les motifs ci-dessus peuvent nécessiter un ajustement là-bas). Dans Notion, la regex est prise en charge dans certaines propriétés de base de données et via des intégrations, mais la barre de recherche elle-même est littérale.
Dans Google Sheets, enveloppez le motif dans REGEXMATCH, REGEXEXTRACT ou REGEXREPLACE : =REGEXEXTRACT(A2, "[\w.+-]+@[\w-]+\.[\w.-]+") extrait l'e-mail de la cellule A2. Les nouvelles fonctions REGEXEXTRACT, REGEXREPLACE et REGEXTEST d'Excel se comportent de manière similaire. Dans VS Code, Sublime et la plupart des éditeurs de code, cliquez sur l'icône .* dans la barre de recherche pour basculer la recherche en mode regex.
Quand un motif se comporte mal, ne le fixez pas. Déposez-le dans un testeur de regex qui surligne les correspondances pendant que vous tapez. Multilities propose un /tools/regex-tester gratuit pour exactement cela, et un outil /tools/find-replace qui exécute vos motifs sur un bloc de texte collé sans toucher au document original. Itérer dans un testeur prend des secondes ; itérer à l'intérieur de Word avec Annuler prend des minutes.
Erreurs courantes et comment les éviter
- Oublier d'échapper le point. Si vous voulez un point littéral (dans un nom de domaine, une extension de fichier ou une phrase), écrivez \. Le point nu correspond à n'importe quoi.
- Utiliser .* quand vous voulez dire \S+ ou [^,]+. Le motif point-étoile est glouton et mange souvent plus que vous ne le vouliez, surtout à travers les virgules, les guillemets ou les balises HTML.
- Ancrer avec ^ et $ mais oublier que ^ et $ travaillent par ligne dans certains outils et par document dans d'autres. Si vous obtenez des correspondances inattendues, vérifiez si votre éditeur a un commutateur « multiligne » ou « dotall ».
- Mélanger les dialectes. JavaScript, Python, PCRE, caractères génériques Word et regex POSIX partagent la majeure partie de la syntaxe mais diffèrent sur des cas particuliers comme les regards autour et les groupes nommés. Quand quelque chose cesse de fonctionner dans une application, le dialecte est généralement la cause.
- Ne pas utiliser de parenthèses pour le remplacement. Si vous voulez garder une partie de ce que vous avez trouvé, vous devez la capturer. Sans parenthèses, vous ne pouvez rien référencer avec $1 ou \1.
Un court flux de travail qui vous rendra rapide
Quand vous devez nettoyer un document, ne commencez pas par écrire la regex parfaite. Commencez par sélectionner deux ou trois lignes d'exemple du texte en désordre et collez-les dans un testeur de regex. Tapez une version littérale d'un exemple, puis améliorez un morceau à la fois : remplacez les chiffres par \d+, remplacez le nom de variable par \w+, remplacez la ponctuation autorisée à varier par une classe de caractères. Après chaque amélioration, vérifiez que le texte de test correspond toujours et que vous n'avez pas commencé à attraper des choses que vous ne vouliez pas.
Une fois le motif correct, copiez-le dans le champ Rechercher du vrai document et exécutez un seul remplacement pour voir s'il se comporte de la même façon à l'échelle. Si le document est important, travaillez sur une copie et utilisez Annuler agressivement. En une semaine, à raison de deux ou trois fois, vous commencerez à écrire des motifs de mémoire pour les nettoyages que vous faites le plus souvent, et la première chose que vous saisirez dans tout export en désordre ne sera plus un clic-clic-clic manuel mais un petit motif qui fait tout d'un coup.
Pour aller plus loin
Les motifs et recettes ci-dessus couvriront la grande majorité des tâches quotidiennes de nettoyage, d'extraction et de reformatage de texte. Quand vous serez prêt à aller plus profond, regardez les regards en avant ((?=...)), les regards en arrière ((?<=...)), les groupes non capturants ((?:...)) et les captures nommées ((?<year>\d{4})). Ils ne sont pas nécessaires au travail quotidien, mais ils débloquent des motifs plus élégants quand vous rencontrez du texte véritablement délicat.
La regex récompense la pratique courte et fréquente plus que toute autre compétence technique. Tenez un fichier de notes avec les cinq recettes que vous prenez le plus, collez-y de nouvelles à mesure que vous les découvrez, et en quelques mois vous serez la personne au bureau à qui tout le monde demande quand son tableur est en désordre. C'est un endroit étonnamment agréable où être.