Les expressions régulières en C++
Généralités
Le C++ est un langage créé par Bjarne Stroustrup en 1979, alors qu’il était aux Laboratoires Bell (Bell Labs), et qui a été rendu public en 1985, date de la parution de son premier livre sur le sujet. C++ est inspiré du langage Simula et du langage C. L’auteur voulait ajouter la gestion d’objets au langage C et a créé ce langage qui a, à ses débuts, été appelé C avec des classes, mais a finalement été baptisé C++ par Bjarne Stroustrup en 1983 : ++ étant un opérateur d’incrémentation en C, l’idée était d’évoquer une évolution du langage. Il est très performant, proche du C qui est compatible dans une très large mesure avec les compilateurs C++. Comme le C, il est compilé, capable de faire du multi-threading et des allocations mémoire dynamiques, mais c’est un véritable langage orienté objet utilisant des classes et des méthodes, capable de gérer les héritages... Il gère aussi les expressions régulières de façon native depuis 2011, avec la version C++11.
Les expressions régulières
L’utilisation des expressions régulières en C++ nécessite l’utilisation du fichier regex par la directive :
#include <regex>
Ce fichier inclut d’autres fichiers contenant des définitions de types et de classes, indispensables pour permettre l’accès aux méthodes de gestion des expressions régulières et pour effectuer des opérations telles que des recherches de correspondances, des remplacements de chaînes de caractères ou des validations de formats.
La bibliothèque du C++ sait manipuler les types d’expressions régulières suivants :
-
expressions régulières de type ECMAscript, telles que définies par l’ECMA (anciennement European Computer Manufacturers Association), c’est le type utilisé par défaut ;
-
expressions régulières basiques ;
-
expressions régulières étendues ;
-
expressions régulières de type awk ;
-
expressions régulières de type grep ;
-
expressions régulières de type egrep.
Le choix du type d’expression est effectué lors de la compilation de l’expression régulière par le passage d’un paramètre indiquant le type de l’expression à traiter. Il est également possible...
Manipulation des expressions régulières
1. Compilation d’expression régulière
Méthode std::regex
La compilation d’une expression régulière est effectuée à l’aide de la classe std::regex qui définit un objet de type expression régulière compilée.
Syntaxe
std::regex re(pattern)
std::regex re(pattern, flags)
avec :
-
re : variable accueillant l’expression régulière compilée.
-
pattern : expression régulière sous forme de chaîne de caractères.
-
flags : indicateurs binaires décrits ci-après.
Tous les flags doivent être précédés du préfixe std::regex_constants:: qui ne sera pas répété ci-dessous pour des raisons de lisibilité.
Les flags de sélection du type d’expression sont les suivants :
-
ECMAScript : expression de type ECMAScript, utilisé par le langage JavaScript (valeur par défaut).
-
basic : expression régulière basique, selon POSIX.
-
extended: expression régulière étendue, selon POSIX.
-
awk : expression de type awk.
-
grep : expression de type grep.
-
egrep : expression de type egrep, mais sans les références arrière.
Les flags de modification d’interprétation de l’expression sont les suivants :
-
icase : expression insensible à la casse des caractères.
-
nosubs : pas de conservation des sous-correspondances.
-
optimize : demande d’optimisation de la recherche de correspondance.
-
collate : correspondance sensible à la localisation (langue du pays).
-
multiline : mode multi-lignes.
Exemple
std::regex pattern("([0-9]{4})-([0-9]{2})-([0-9]{2})");
2. Recherche de chaînes
a. Méthode std::regex_match
La fonction std::regex_match() retourne un booléen indiquant s’il y a correspondance complète entre l’expression régulière et la chaîne de caractères passée en paramètre à la fonction.
Syntaxe
bool regex_match(text, regex)
bool regex_match(text, regex, flags)
bool regex_match(text, match, regex)
bool regex_match(text, match, regex, flags)
avec :
-
text : chaîne de caractères à...