Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. Les expressions régulières en C#
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

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 à...

Les expressions régulières en C#

Généralités 

Le C# est un langage développé par Microsoft pour sa plate-forme .NET. Il est orienté objet, compilé, dérivé du C++, et proche du langage Java. La première version est sortie avec Visual Studio .NET 2002. Il a beaucoup évolué depuis sa création, et un compilateur est même apparu sur Linux en 2009 avec le package mono, qui permet d’utiliser du C# ailleurs que sur Windows. Il peut servir, par exemple, à développer des applications de bureau, des applications web ou des jeux vidéo.

Les expressions régulières 

La gestion des expressions régulières en C# remonte à la première version du langage. Les expressions sont proches du type PCRE, mais il est possible d’utiliser des expressions de type ECMAscript. Pour une comparaison plus fine des différences entre les expressions de type C# (.NET) et celles de type PCRE, il est possible de consulter le site Regular-Expressions.info et notamment l’URL https://www.regular-expressions.info/refrecurse.html.

La bibliothèque de gestion des expressions régulières du C# comporte de nombreuses fonctions, et comme pour les chapitres relatifs aux autres langages, nous ne pourrons présenter dans cet ouvrage qu’un rapide aperçu des possibilités de la bibliothèque. Les lecteurs curieux pourront trouver la documentation de référence sur le site de Microsoft https://learn.microsoft.com/.

En C#, il existe deux façons d’écrire une expression régulière, mais il n’y a pas, comme pour le langage Julia, de différence de types ; il s’agit seulement de deux façons différentes d’écrire une même chaîne de caractères de type string. Dans certains cas, la façon littérale peut s’avérer plus lisible que la façon standard. Dans une chaîne de caractères, un caractère...

Manipulation des expressions régulières 

1. Compilation d’expression régulière 

Constructeur Regex() 

Le constructeur Regex() compile une expression régulière qui lui est passée sous forme de chaîne de caractères. La chaîne compilée résultante peut ensuite être utilisée pour activer une méthode de recherche, de remplacement, etc.

Syntaxe

Regex regex  = new Regex(pattern);  
Regex regex  = new Regex(pattern, flags); 

avec :

regex : la variable accueillant l’expression régulière compilée ;

pattern  : l’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 RegexOptions. qui ne sera pas répété ci-dessous pour des raisons de lisibilité.

Les flags autorisés sont les suivants (une description complète est disponible sur le site de Microsoft cité précédemment, à la section RegexOptions Enum) :

Compiled

L’expression est compilée en code MSIL (MicroSoft Intermediate Language) au lieu d’être interprétée.

CultureInvariant

Les différences culturelles des langages sont ignorées.

ECMAScript

Il active le mode de compatibilité avec les expressions de type ECMAscript.

ExplicitCapture

Il indique que les captures valides sont seulement les captures nommées ou numérotées de la forme (?<name>...). Cela autorise les parenthèses non accompagnées d’un nom à se comporter comme des groupes non-capturants. 

IgnoreCase

Il indique que la casse des lettres est ignorée.

IgnorePatternWhitespace

Il élimine les espaces blancs non échappés de l’expression et autorise les commentaires grâce au caractère #.

Multiline

Mode multi-lignes : il change la signification des métacaractères ^ et $ de sorte qu’ils correspondent respectivement au début et à la fin de chaque ligne, et non au début et à la fin de la chaîne de caractères.

NonBacktracking

Il modifie le fonctionnement de l’interpréteur de façon à garantir...