Regex - 01 - Les bases : caractères litteraux et echappement

Comprendre les caractères litteraux, le point, l'antislash et les caractères speciaux a echapper dans une regex.

01 - Les bases : caractères litteraux et echappement

Ce que tu vas apprendre

  • Comment les caractères litteraux matchent exactement eux-memes
  • Le rôle du point . comme joker
  • L'antislash \ pour echapper les caractères speciaux
  • La liste des caractères speciaux a connaître

Prerequisites

Avoir lu l'introduction et avoir regex101.com ouvert dans un onglet.


Ta première regex

Ouvre regex101.com, choisis le flavour "ECMAScript (JavaScript)" en haut a gauche, et tape ceci dans le champ "Regular Expression" :

hello

Puis dans le champ "Test String", tape :

hello world
say hello to my little friend
HELLO

Tu vas voir que les deux premières lignes ont "hello" surligne, mais pas "HELLO". Pourquoi ? Parce que les regex sont sensibles a la casse par défaut. Un h minuscule ne matche pas un H majuscule.

C'est le principe fondamental : un caractère litteral matche exactement lui-meme. La regex chat matche la chaîne "chat", pas "Chat", pas "CHAT", pas "ch4t".

Le point : le joker universel

Le point . est le premier caractère special que tu dois connaître. Il matche n'importe quel caractère sauf le retour a la ligne.

Essaie cette regex :

c.t

Sur ce texte :

cat
cot
cut
c t
c9t
ct

Tu verras que c.t matche "cat", "cot", "cut", "c t" (avec un espace) et "c9t". Mais pas "ct" (il manque un caractère entre c et t).

Le point est gourmand et pas difficile. Lettre, chiffre, espace, symbole, il prend tout. La seule chose qu'il refuse, c'est le saut de ligne \n.

L'antislash : l'echappement

Et si tu veux chercher un vrai point ? Genre dans "3.14" ou "fichier.txt" ?

C'est la que l'antislash \ entre en jeu. Il dit a la regex : "le caractère qui suit, prends-le au sens litteral".

3\.14

Cette regex matche "3.14" mais pas "3X14" ni "3 14". Le \. signifie "un vrai point, pas le joker".

Teste sur regex101 :

3.14
3X14
3 14
3.14159

Tu verras la différence entre 3.14 (regex sans echappement, matche aussi "3X14") et 3\.14 (matche seulement quand il y a un vrai point).

Les caractères speciaux

En regex, certains caractères ont une signification speciale. Si tu veux les utiliser au sens litteral, il faut les echapper avec \. Voici la liste complète :

.  *  +  ?  ^  $  {  }  [  ]  (  )  |  \

Ca fait 14 caractères a retenir. En pratique, tu n'auras pas besoin de les memoriser tous d'un coup. Tu les apprendras au fil de cette serie. Mais garde cette liste sous le coude.

Quelques exemples concrets :

Tu veux matcher Tu ecris
Un point . \.
Un asterisque * \*
Un dollar $ \$
Une parenthese ( \(
Un crochet [ \[
Un pipe | `\
Un antislash \ \\

L'antislash lui-meme est un caractère special. Pour matcher un antislash litteral, tu en mets deux : \\. Oui, c'est un peu meta.

Premier pattern utile : trouver une extension de fichier

Combinons ce qu'on sait. Tu veux trouver tous les fichiers .js dans une liste :

\.js

Texte de test :

app.js
index.html
utils.js
style.css
node.json

La regex \.js matche "app.js", "utils.js" et aussi "node.json" (parce que ".js" apparaît au début de ".json"). On verra plus tard comment etre plus precis avec les ancres.

L'erreur classique du débutant

Je vois souvent des débutants écrire des regex comme :

fichier.txt

En pensant que ca matche uniquement "fichier.txt". Mais le point etant un joker, ca matche aussi "fichierXtxt", "fichier txt", "fichier9txt". Si tu veux matcher le nom de fichier exact, il faut écrire :

fichier\.txt

C'est un détail qui fait la différence entre une regex qui marche "a peu pres" et une qui marche vraiment. Sur paltemps.fr, cette erreur a deja cause un bug en production sur un système de filtrage de fichiers. Depuis, on echapper les points systématiquement.

Combiner les litteraux et le point

Tu peux melanger des caractères litteraux et des points dans le meme pattern :

h.llo

Matche : "hello", "hallo", "hullo", "h3llo", "h llo"

..\...\.....

Matche des dates au format "XX.XX.XXXXX"... mais c'est illisible. On verra des outils bien plus elegants dans les prochains articles.

Un mot sur la casse

Par défaut, les regex sont sensibles a la casse. Pour les rendre insensibles, tu ajoutes le flag i :

  • /hello/ matche "hello" mais pas "Hello"
  • /hello/i matche "hello", "Hello", "HELLO", "hElLo"

Sur regex101.com, tu peux activer ce flag en cliquant sur les drapeaux a droite du champ de regex.

Résumé

  • Les caractères litteraux matchent exactement eux-memes
  • Le point . matche n'importe quel caractère sauf le retour a la ligne
  • L'antislash \ echappe un caractère special pour le rendre litteral
  • Il y a 14 caractères speciaux : . * + ? ^ $ { } [ ] ( ) | \
  • Le flag i rend la regex insensible a la casse
  • Toujours echapper le point quand tu veux un vrai point

Article précédent 00 - Introduction
Article suivant 02 - Quantificateurs

Sources

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.