Expressions régulières en C++ avec exemples : guide complet pour débutants
\n\nLes expressions régulières (regex) sont un outil puissant pour rechercher, vérifier et remplacer du texte selon un motif. En C++, le travail avec les expressions régulières est implémenté via la bibliothèque <regex>, apparue dans la norme C++11. Dans cet article, nous allons aborder les bases du travail avec regex en C++ à l'aide d'exemples pratiques, compréhensibles même pour les débutants.
Que sont les expressions régulières et à quoi servent-elles ?
\n\nUne expression régulière est une séquence de caractères définissant un motif de recherche dans un texte. Par exemple, le motif \\d{3}-\\d{2}-\\d{2} décrit le format d'un numéro SNILS : trois chiffres, un tiret, deux chiffres, un tiret, deux chiffres.
Les principales tâches résolues par les expressions régulières en C++ :
\n\n- \n
- Vérification de la validité des saisies (email, téléphone, date) \n
- Extraction de données à partir d'un texte \n
- Recherche et remplacement de sous-chaînes \n
- Division de chaînes selon des séparateurs complexes \n
La bibliothèque <regex> fournit trois algorithmes principaux :
- \n
std::regex_match— correspondance complète de la chaîne avec le motif \n std::regex_search— recherche d'une correspondance dans la chaîne \n std::regex_replace— remplacement des correspondances selon le motif \n
Syntaxe de base des expressions régulières en C++
\n\nAvant d'écrire du code, examinons les éléments de base de la syntaxe regex qui seront utiles dans les exemples :
\n\n| Caractère | Signification | Exemple |
|---|---|---|
. | N'importe quel caractère (sauf saut de ligne) | c.t — cat, cot, cut |
\\d | Chiffre (0-9) | \\d\\d — 23, 45, 99 |
\\w | Lettre, chiffre ou tiret bas | \\w+ — mot |
\\s | Caractère d'espacement | \\s+ — un ou plusieurs espaces |
* | 0 répétition ou plus | ab*c — ac, abc, abbc |
+ | 1 répétition ou plus | ab+c — abc, abbc (pas ac) |
? | 0 ou 1 répétition | colou?r — color, colour |
{n} | Exactement n répétitions | \\d{3} — 123, 456 |
[abc] | N'importe quel caractère de l'ensemble | [aeiou] — voyelle |
() | Groupe de capture | (\\d{2})-(\\d{2}) |
Exemple 1 : Vérification d'une adresse email avec regex_match
\n\nCommençons par quelque chose de simple — vérifions si une chaîne correspond au format email. Utilisons std::regex_match, qui exige une correspondance complète.
#include <iostream>\n#include <regex>\n#include <string>\n\nint main() {\n std::string email = "user@example.com";\n // Motif simple pour email :\n // [\\w.]+ — un ou plusieurs caractères (lettres, chiffres, point, tiret bas)\n // @ — symbole arobase\n // [\\w.]+ — nom de domaine\n // \\.[a-z]{2,} — point et domaine de premier niveau (au moins 2 lettres)\n std::regex pattern(R"([\\w.]+@[\\w.]+\\.\\w{2,})");\n \n if (std::regex_match(email, pattern)) {\n std::cout << "Email valide" << std::endl;\n } else {\n std::cout << "Email invalide" << std::endl;\n }\n \n // Exemple avec un email invalide\n email = "user@com";\n if (std::regex_match(email, pattern)) {\n std::cout << "Email valide" << std::endl;\n } else {\n std::cout << "Email invalide" << std::endl;\n }\n \n return 0;\n}\n\nRésultat de l'exécution :
\nEmail valide\nEmail invalide\n\nNotez que