Outils d'utilisateurs

Outils du Site


expressions_regulieres_3

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

expressions_regulieres_3 [2015/02/14 17:28]
woly
expressions_regulieres_3 [2019/01/30 21:56] (Version actuelle)
alavida [Réutiliser un groupe de capture]
Ligne 1: Ligne 1:
  
-^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^+[[expressions_regulieres_2|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[validation_motifs|Chapitre suivant]] ^
  
-====== Les expressions régulières 3 ======+====== [Aller plus loin] Les expressions régulières 3 ======
  
 ===== Les groupes de capture ===== ===== Les groupes de capture =====
Ligne 57: Ligne 57:
 ==== Réutiliser un groupe de capture ==== ==== Réutiliser un groupe de capture ====
  
-Les chaînes identifiées par un groupe de capture peut être réutilisées dans le motif. Chaque groupe est identifié par un numéro, dans l'ordre de leur déclaration. Pour réutiliser une chaîne, il faut indiquer le numéro de groupe précédé d'une barre oblique inverse : <html>\1</html>, <html>\2</html>, <html>\3</html>, etc.+Les chaînes identifiées par un groupe de capture peuvent être réutilisées dans le motif. Chaque groupe est identifié par un numéro, dans l'ordre de leur déclaration. Pour réutiliser une chaîne, il faut indiquer le numéro de groupe précédé d'une barre oblique inversée : <html>\1</html>, <html>\2</html>, <html>\3</html>, etc.
  
 Par exemple, pour écrire un motif qui permet d'identifier n'importe quelle chaîne commençant et terminant par le même caractère, on pourra écrire le motif suivant : Par exemple, pour écrire un motif qui permet d'identifier n'importe quelle chaîne commençant et terminant par le même caractère, on pourra écrire le motif suivant :
Ligne 74: Ligne 74:
 { {
     std::regex const pattern { R"((.).*\1)" };     std::regex const pattern { R"((.).*\1)" };
-    std::cout << "'(.).*\1' match with '': " << std::boolalpha << +    std::cout << "'(.).*\\1' match with '': " << std::boolalpha << 
         std::regex_match("", pattern) << std::endl;         std::regex_match("", pattern) << std::endl;
    
-    std::cout << "'(.).*\1' match with 'abc': " << std::boolalpha << +    std::cout << "'(.).*\\1' match with 'abc': " << std::boolalpha << 
         std::regex_match("abc", pattern) << std::endl;         std::regex_match("abc", pattern) << std::endl;
    
-    std::cout << "'(.).*\1' match with 'aba': " << std::boolalpha << +    std::cout << "'(.).*\\1' match with 'aba': " << std::boolalpha << 
         std::regex_match("aba", pattern) << std::endl;         std::regex_match("aba", pattern) << std::endl;
    
-    std::cout << "'(.).*\1' match with 'abcdefa': " << std::boolalpha << +    std::cout << "'(.).*\\1' match with 'abcdefa': " << std::boolalpha << 
         std::regex_match("abcdefa", pattern) << std::endl;         std::regex_match("abcdefa", pattern) << std::endl;
 } }
Ligne 91: Ligne 91:
  
 <code> <code>
-'(.).*' match with '': false +'(.).*\1' match with '': false 
-'(.).*' match with 'abc': false +'(.).*\1' match with 'abc': false 
-'(.).*' match with 'aba': true +'(.).*\1' match with 'aba': true 
-'(.).*' match with 'abcdefa': true+'(.).*\1' match with 'abcdefa': true
 </code> </code>
  
-De le même façon, si on veut pouvoir identifier une chaîne qui commence par deux caractères et qui se termine par ces deux caractères dans l'ordre inverse, on va pouvoir utiliser deux groupes de capture. Le motif s'écrit alors : <html>(.)(.).*\2\1</html>.+De la même façon, si on veut pouvoir identifier une chaîne qui commence par deux caractères et qui se termine par ces deux caractères dans l'ordre inverse, on va pouvoir utiliser deux groupes de capture. Le motif s'écrit alors : <html>(.)(.).*\2\1</html>.
  
-Pour terminer avec les groupes de capture, ils vont permettre de récupérer dans le code code C++ une sous-chaîne correspondant à un motif complet de la chaîne. En effet, imaginons que l'on souhaite écrire un motif qui permet de reconnaître une date au format <html>jj/mm/aa</html> (jour-mois-année, chaque élément étant écrit avec deux chiffres) et qui permet de récupérer le jour. On pourrait écrire simplement le motif <html>^[[:digit:]]{2}</html> (ou <html>^\d{2}</html>). Le problème est que ce motif peut correspondre à n'importe quelle chaîne commençant par deux chiffre (pour rappel, le caractère <html>^</html> est une ancre indiquant le début de la séquence cible), par exemple <html>"12abcde"</html> ou <html>"123456"</html>.+Pour terminer avec les groupes de capture, ils vont permettre de récupérer dans le code C++ une sous-chaîne correspondant à un motif complet de la chaîne. En effet, imaginons que l'on souhaite écrire un motif qui permet de reconnaître une date au format <html>jj/mm/aa</html> (jour-mois-année, chaque élément étant écrit avec deux chiffres) et qui permet de récupérer le jour. On pourrait écrire simplement le motif <html>^[[:digit:]]{2}</html> (ou <html>^\d{2}</html>). Le problème est que ce motif peut correspondre à n'importe quelle chaîne commençant par deux chiffre (pour rappel, le caractère <html>^</html> est une ancre indiquant le début de la séquence cible), par exemple <html>"12abcde"</html> ou <html>"123456"</html>.
  
 Pour éviter cela, on va simplement écrire un motif qui correspond à une date, selon le format indiqué : <html>\d{2}/\d{2}/\d{2}</html>. On ajoute ensuite un groupe de capture pour les sous-chaînes que l'on souhaite récupérer dans le code C++. Par exemple, pour récupérer les jours, on écrit : <html>(\d{2})/\d{2}/\d{2}</html>. Cela permet de récupérer la date du jour, en garantissant que le format de date est respecté. Pour éviter cela, on va simplement écrire un motif qui correspond à une date, selon le format indiqué : <html>\d{2}/\d{2}/\d{2}</html>. On ajoute ensuite un groupe de capture pour les sous-chaînes que l'on souhaite récupérer dans le code C++. Par exemple, pour récupérer les jours, on écrit : <html>(\d{2})/\d{2}/\d{2}</html>. Cela permet de récupérer la date du jour, en garantissant que le format de date est respecté.
Ligne 105: Ligne 105:
 Nous verrons par la suite le code C++ utilisé pour récupérer les groupes capturés. Nous verrons par la suite le code C++ utilisé pour récupérer les groupes capturés.
  
-^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^+[[expressions_regulieres_2|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[validation_motifs|Chapitre suivant]] ^
  
-{{tag> Cours C++}} 
expressions_regulieres_3.1423931328.txt.gz · Dernière modification: 2015/02/14 17:28 par woly