Expressions régulières en C++ : un outil puissant pour travailler avec le texte
Les expressions régulières (regex) sont un outil extrêmement puissant pour rechercher, extraire et remplacer des fragments de texte selon un modèle donné. En C++, le support des expressions régulières est apparu dans la norme C++11 et est implémenté dans le fichier d'en-tête <regex>. Dans cet article, nous allons détailler comment utiliser les expressions régulières en C++ à travers des exemples pratiques.
Composants principaux de la bibliothèque <regex>
La bibliothèque <regex> comprend plusieurs classes et fonctions clés :
std::regex— classe représentant une expression régulière compilée.std::smatch— conteneur pour stocker les résultats de recherche (pour les chaînes de typestd::string).std::regex_match— vérifie si toute la chaîne correspond au modèle.std::regex_search— recherche la première occurrence du modèle dans la chaîne.std::regex_replace— remplace les correspondances par le texte spécifié.
Examinons chacun de ces composants avec des exemples.
Exemple 1 : Vérification de la conformité d'une chaîne à un modèle (regex_match)
La fonction std::regex_match retourne true si toute la chaîne correspond entièrement à l'expression régulière. C'est idéal pour la validation de données, par exemple, la vérification d'un email ou d'un numéro de téléphone.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Modèle pour vérifier l'email (simplifié) std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})"); if (std::regex_match(email, pattern)) { std::cout << "Email valide." << std::endl; } else { std::cout << "Email invalide." << std::endl; } // Exemple avec un email invalide std::string bad_email = "user@.com"; if (std::regex_match(bad_email, pattern)) { std::cout << "Email valide." << std::endl; } else { std::cout << "Email invalide." << std::endl; } return 0;}Dans cet exemple, nous avons utilisé une chaîne brute R"(...)" pour éviter l'échappement des antislashs. Le modèle vérifie que la chaîne contient une partie locale, le signe @, un nom de domaine et un domaine de premier niveau.
Exemple 2 : Recherche d'une sous-chaîne dans un texte (regex_search)
Si vous devez trouver la première occurrence d'un modèle à l'intérieur d'une chaîne, on utilise std::regex_search. Les résultats sont stockés dans un objet std::smatch.
#include <iostream>#include <regex>#include <string>
int main() { std::string text = "Mon numéro de téléphone : +7 (123) 456-78-90. Appelez-moi !"; // Modèle pour rechercher un numéro de téléphone russe std::regex phone_pattern(R"(\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}[- ]?\\d{2}[- ]?\\d{2})"); std::smatch match; if (std::regex_search(text, match, phone_pattern)) { std::cout << "Numéro trouvé : " << match.str() << std::endl; std::cout << "Position : " << match.position() << std::endl; } else { std::cout << "Numéro non trouvé." << std::endl; } return 0;}L'objet match contient non seulement la chaîne trouvée, mais aussi des informations sur la position de l'occurrence. La méthode match.str() retourne le fragment trouvé, et match.position() — l'indice de début de la correspondance dans la chaîne source.
Exemple 3 : Remplacement de texte avec regex_replace
La fonction std::regex_replace remplace toutes les occurrences du modèle par la chaîne spécifiée. On peut utiliser des références arrière (backrefer