Comment utiliser les expressions regulieres (regex) : guide complet pour developpeurs

12 min de lecture

Apprenez les expressions regulieres depuis zero. Syntaxe de base, classes de caracteres, quantificateurs, groupes, lookahead, lookbehind et motifs courants pour email, telephone, URL et IP avec des exemples pratiques.

Que sont les expressions regulieres et a quoi servent-elles

Les expressions regulieres (regex ou regexp) sont des motifs de recherche qui servent a trouver, valider et transformer du texte avec precision. Elles sont essentielles en developpement, en administration systeme et dans le traitement de donnees.

Une regex est une suite de caracteres qui decrit un motif. Avec une seule expression bien ecrite, on peut remplacer de nombreuses conditions et recherches manuelles.

Usages frequents :

  • Validation : email, telephone, URL, code postal et autres formats
  • Recherche et remplacement : retrouver rapidement des motifs dans un grand texte
  • Extraction : recuperer des informations utiles dans des logs ou des textes non structures
  • Analyse de logs : isoler erreurs, IP, routes et codes
  • Linting et formatage : verifier des conventions de code
  • Routing web : definir des schemas d'URL dans des frameworks

Les regex existent dans presque tous les langages de programmation : JavaScript, Python, Java, C#, PHP, Ruby, Go, Rust et bien d'autres. Elles sont aussi tres presentes dans grep, sed et awk.

Pour pratiquer pendant la lecture, ouvrez notre outil de test regex dans un autre onglet.

Syntaxe de base : caracteres litteraux et metacaracteres

La syntaxe regex combine des caracteres litteraux, recherches tels quels, et des metacaracteres, qui ont une signification speciale.

Caracteres litteraux : les lettres, chiffres et beaucoup de symboles sont interpretes de facon directe. Le motif chat trouve le mot "chat".

Metacaracteres essentiels :

MetacaractereSignificationExempleCorrespond a
.N'importe quel caractere sauf retour lignec.at"chat", "c3at"
^Debut de ligne ou de chaine^BonjourSeulement au debut
$Fin de ligne ou de chainemonde$Seulement a la fin
*0 repetition ou plusab*c"ac", "abc", "abbc"
+1 repetition ou plusab+c"abc", "abbc"
?0 ou 1 repetitioncolou?r"color", "colour"
|Alternativechat|chien"chat" ou "chien"
\Echappement\.Un point litteral

Echapper les metacaracteres : si vous voulez chercher un metacaractere comme texte, il faut le preceder d'un \.

  • \. cherche un point litteral
  • \* cherche un asterisque
  • \? cherche un point d'interrogation
  • \( et \) cherchent des parentheses
  • \\ cherche un antislash

Exemple pratique : pour retrouver "prix : $9.99", utilisez prix : \$9\.99.

Classes de caracteres et classes predefinies

Les classes de caracteres permettent de definir un ensemble de caracteres autorises a une position donnee du motif.

MotifSignificationExemple
[abc]a, b ou c"a", "b", "c"
[a-z]Toute lettre minuscule"a", "m", "z"
[A-Z]Toute lettre majuscule"A", "M", "Z"
[0-9]Tout chiffre"0", "5", "9"
[a-zA-Z]Toute lettre"a", "Z", "m"
[a-zA-Z0-9]Tout alphanumerique"a", "3", "Z"
[^abc]Tout sauf a, b ou c"d", "1", "Z"
[^0-9]Tout ce qui n'est pas un chiffre"a", "!", " "

Classes predefinies : \d pour les chiffres, \w pour les caracteres de mot, \s pour les espaces blancs, et leurs versions majuscules pour l'inverse.

Frontiere de mot : \bchat\b trouve le mot complet "chat", mais pas "chaton".

Exemple pratique : ^[a-zA-Z0-9-]+$ valide une chaine composee uniquement de lettres, chiffres et tirets.

Quantificateurs et repetitions

Les quantificateurs indiquent combien de fois l'element precedent doit apparaitre.

QuantificateurSignificationExempleCorrespond a
*0 fois ou plus\d*"", "5", "123"
+1 fois ou plus\d+"5", "123"
?0 ou 1 fois-?\d+"42", "-42"
{n}Exactement n fois\d{4}"2026"
{n,}n fois ou plus\d{2,}"12", "123"
{n,m}Entre n et m fois\d{2,4}"12", "1234"

Par defaut, les quantificateurs sont greedy : ils capturent le maximum possible. En ajoutant ?, ils deviennent lazy et capturent le minimum necessaire.

Dans <b>Bonjour</b> et <b>Monde</b>, <b>.*</b> capture tout, alors que <b>.*?</b> isole chaque bloc.

Exemple pratique : ^\d{5}(-\d{4})?$ valide un code ZIP americain avec extension optionnelle.

Groupes de capture et references

Les groupes servent a structurer un motif, stocker des sous-resultats et les reutiliser ensuite.

SyntaxeTypeDescription
(motif)Groupe capturantCapture le texte correspondant
(?:motif)Groupe non capturantRegroupe sans capturer
(?<nom>motif)Groupe nommeCapture avec un nom
\1, \2BackreferenceReference a une capture precedente

Exemple : (\d{4})-(\d{2})-(\d{2}) extrait annee, mois et jour d'une date ISO.

Les groupes nommes comme (?<year>\d{4}) rendent le code plus lisible.

Les backreferences servent notamment a trouver des mots doubles ou a imposer la meme citation ouvrante et fermante.

Alternance : (https?|ftp):// correspond a "http://", "https://" ou "ftp://". Testez ces motifs dans notre outil regex.

Lookahead et lookbehind : assertions de position

Le lookahead et le lookbehind verifient ce qui se trouve apres ou avant la position courante, sans consommer de caracteres.

SyntaxeNomSignification
(?=motif)Positive lookaheadCe qui suit doit correspondre
(?!motif)Negative lookaheadCe qui suit ne doit pas correspondre
(?<=motif)Positive lookbehindCe qui precede doit correspondre
(?<!motif)Negative lookbehindCe qui precede ne doit pas correspondre

Exemple 1 : ^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$ valide un mot de passe fort.

Exemple 2 : (?<=\$)\d+\.\d{2} extrait un prix sans le symbole monetaire.

Exemple 3 : \w+(?!\s*:) trouve les mots qui ne sont pas suivis d'un deux-points.

Exemple 4 : (?<!-)\b\d+\b trouve seulement les nombres positifs. Selon le flavor, le lookbehind peut etre plus ou moins limite.

Motifs courants : email, telephone, URL et IP

Voici quelques motifs tres utilises pour la validation. Pour des formats complexes comme les emails, une verification cote serveur reste conseillee.

1. Email : ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

2. Telephone international (E.164) : ^\+?[1-9]\d{1,14}$

3. URL : ^https?:\/\/[\w.-]+(?:\.[a-zA-Z]{2,})(?:\/[\w.~:/?#\[\]@!$&'()*+,;=-]*)?$

4. IPv4 : ^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$

5. Date ISO : ^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$

6. Couleur hex CSS : ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$

Testez ces motifs dans notre outil regex et utilisez aussi notre validateur JSON pour des structures de donnees plus larges.

Flags, performances et bonnes pratiques

Pour bien maitriser les regex, il faut comprendre les flags et appliquer quelques regles de performance et de maintenabilite.

FlagNomEffet
gGlobalTrouve toutes les correspondances
iInsensitiveIgnore la casse
mMultiline^ et $ fonctionnent ligne par ligne
sDotallLe point couvre aussi les retours ligne
uUnicodeSupport complet d'Unicode

En JavaScript : /motif/flags. En Python : re.compile(r'motif', re.IGNORECASE | re.MULTILINE).

  • Evitez le backtracking catastrophique : les motifs ambigus comme (a+)+$ peuvent devenir tres couteux
  • Soyez precis : [a-z]+ vaut souvent mieux que .+
  • Utilisez des ancres : ^ et $ limitent les recherches inutiles
  • Preferez les groupes non capturants : (?:...) si vous n'avez pas besoin de recuperer la valeur
  • Compilez les motifs reutilises : pour reduire le cout d'execution

Commentez vos regex complexes, testez les cas positifs et negatifs et n'utilisez pas regex pour parser HTML, XML ou JSON en profondeur. Pour vous exercer, utilisez notre outil de test regex.

Essayez cet outil :

Ouvrir l'outil

Questions fréquentes

Quelle est la difference entre * + et ? en regex ?

L'asterisque (*) signifie 0 repetition ou plus. Le signe plus (+) signifie 1 repetition ou plus. Le point d'interrogation (?) signifie 0 ou 1 repetition et rend l'element optionnel.

Comment valider un email avec une expression reguliere ?

Un motif pratique est ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$. Il couvre les cas les plus courants, mais il est conseille d'ajouter une validation serveur pour la production.

Que signifient \d \w et \s en regex ?

\d represente un chiffre, \w un caractere de mot et \s un espace blanc. Les versions majuscules \D, \W et \S representent leurs contraires.

Qu'est-ce qu'un lookahead et a quoi sert-il ?

Un lookahead est une assertion qui verifie la presence d'un motif apres la position courante sans consommer de caracteres. Il est tres utile pour des validations complexes comme les mots de passe.

Qu'est-ce que le backtracking catastrophique et comment l'eviter ?

C'est un comportement ou le moteur teste un nombre enorme de combinaisons a cause d'un motif ambigu. On l'evite avec des motifs plus precis, sans quantificateurs imbriques inutiles, et avec des constructions plus strictes quand elles existent.

Les regex fonctionnent-elles pareil dans tous les langages ?

Non. La base est similaire, mais chaque langage a son propre flavor. Les differences touchent souvent le lookbehind, Unicode, les escapes et certaines fonctions avancees.