Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
expressions_regulieres_3 [2014/08/08 17:51] gbdivers |
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 ===== | ||
- | Les groupes de capture permet de réutiliser une sous-chaîne de la séquence cible, identifiée par un motif. La sous-chaîne capturée peut être réutilisée dans le motif ou être récupéré dans le code C++. Pour créer un groupe de capture, vous devez simplement écrire le motif correspondant à ce groupe entre parenthèses. Pour que cela soit plus clair, voyons quelques exemples. | + | Les groupes de capture permettent de réutiliser une sous-chaîne de la séquence cible, identifiée par un motif. La sous-chaîne capturée peut être réutilisée dans le motif ou être récupérée dans le code C++. Pour créer un groupe de capture, vous devez simplement écrire le motif correspondant à ce groupe entre parenthèses. Pour que cela soit plus clair, voyons quelques exemples. |
==== Répéter un groupe de capture ==== | ==== Répéter un groupe de capture ==== | ||
Ligne 57: | Ligne 57: | ||
==== Réutiliser un groupe de capture ==== | ==== Réutiliser un groupe de capture ==== | ||
- | Le chaînes identifiées par un groupe de capture peut être réutilisée 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++}} |