Extraire les composantes d'une expression régulière ?
22 réponses
Picard
Bonjour,
je dois faire un développement en environnement Linux pour lequel je n'ai pas le
droit d'utiliser des COTS externes à l'environnement par défaut de Suse.
J'ai trouvé comme seul librairie, regexp, qui semble tout à fait correspondre à
ce que j'attends.
Je dois parser une chaîne de caractères dont le format est du genre:
<identifiant composé de caractères quelconques y compris _>_<valeur
entière>-<valeur entière>x<valeur entière>
Mon idée est de pouvoir extraire chaque entité défini entre <>.
Pour cela, j'ai écrit le code décrit ci-dessous.
Je me trouve confronté à différents problèmes:
- si j'utilise l__pattern tel que défini, cela ne matche pas un fichier de nom
"PF_toto_0-320x245.tutu.tata"
- si j'utilise l__pattern="([:alnum:_]+)-", cela matche: il m'affiche la chaîne
"PF_toto_0-" alors que j'attendais seulement "PF_toto_0".
Serait-il possible de m'expliquer pourquoi mon code ne fonctionne pas, s'il vous
plaît ?
Si l'explication est un peu longue, je suis prêt à accepter uniquement le bout
de code qui va bien ;-)
Ma contrainte est d'utiliser des expressions régulières car je souhaite en
comprendre le mécanisme. Je ne suis donc pas intéressé par une solution à base
de strtok.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie traitant les expressions régulières en C++ mais sans COTS supplémentaire genre Boost.
Boost a des expressions regulieres.
loufoque
#include "regex.h"
Ceci est une bibliothèque C, comme le montre le merveilleux usage de pointeurs et de malloc. Il serait peut-être plus approprié d'utiliser une bibliothèque C++ ou une bibliothèque C avec des wrappers C++.
De plus, il me semble que ton problème n'est lié qu'aux expressions régulières et non pas à la programmation avec quel langage que ce soit.
#include "regex.h"
Ceci est une bibliothèque C, comme le montre le merveilleux usage de
pointeurs et de malloc.
Il serait peut-être plus approprié d'utiliser une bibliothèque C++ ou
une bibliothèque C avec des wrappers C++.
De plus, il me semble que ton problème n'est lié qu'aux expressions
régulières et non pas à la programmation avec quel langage que ce soit.
Ceci est une bibliothèque C, comme le montre le merveilleux usage de pointeurs et de malloc. Il serait peut-être plus approprié d'utiliser une bibliothèque C++ ou une bibliothèque C avec des wrappers C++.
De plus, il me semble que ton problème n'est lié qu'aux expressions régulières et non pas à la programmation avec quel langage que ce soit.
Picard
Difficile en effet de contester que mon code ressemble plus à du C qu'à du C++. Comme je fais des tests, j'ai simplement repompé le code exemple que j'ai trouvé sur le net et qui est effectivement du C.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie traitant les expressions régulières en C++ mais sans COTS supplémentaire genre Boost. En particulier, je n'ai rien trouvé dans la librairie STL. De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C glob.
Si vous avez connaissance de telles librairies, je suis intéressé (même si j'ai réussi finalement à faire marcher ce code :je n'ai donc plus besoin d'aide dessus). Là, je pense que c'est une question de langage.
Mais je rappelle cette contrainte forte: je ne peux récupérer d'autres librairies hors celles fournies par défaut avec Linux Suse 9.2 et ce, même si elles sont gratuites comme regex++.
Difficile en effet de contester que mon code ressemble plus à du C
qu'à du C++.
Comme je fais des tests, j'ai simplement repompé le code exemple que
j'ai trouvé sur le net et qui est effectivement du C.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie
traitant les expressions régulières en C++ mais sans COTS
supplémentaire genre Boost.
En particulier, je n'ai rien trouvé dans la librairie STL.
De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C
glob.
Si vous avez connaissance de telles librairies, je suis intéressé
(même si j'ai réussi finalement à faire marcher ce code :je n'ai
donc plus besoin d'aide dessus).
Là, je pense que c'est une question de langage.
Mais je rappelle cette contrainte forte: je ne peux récupérer
d'autres librairies hors celles fournies par défaut avec Linux Suse
9.2 et ce, même si elles sont gratuites comme regex++.
Difficile en effet de contester que mon code ressemble plus à du C qu'à du C++. Comme je fais des tests, j'ai simplement repompé le code exemple que j'ai trouvé sur le net et qui est effectivement du C.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie traitant les expressions régulières en C++ mais sans COTS supplémentaire genre Boost. En particulier, je n'ai rien trouvé dans la librairie STL. De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C glob.
Si vous avez connaissance de telles librairies, je suis intéressé (même si j'ai réussi finalement à faire marcher ce code :je n'ai donc plus besoin d'aide dessus). Là, je pense que c'est une question de langage.
Mais je rappelle cette contrainte forte: je ne peux récupérer d'autres librairies hors celles fournies par défaut avec Linux Suse 9.2 et ce, même si elles sont gratuites comme regex++.
loufoque
Mais cela, c'est par défait car je n'ai trouvé aucune librairie traitant les expressions régulières en C++ mais sans COTS supplémentaire genre Boost.
Suse doit avoir un paquet pour installer boost.
En particulier, je n'ai rien trouvé dans la librairie STL. De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C glob.
les expressions régulières sont dans TR1.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie
traitant les expressions régulières en C++ mais sans COTS
supplémentaire genre Boost.
Suse doit avoir un paquet pour installer boost.
En particulier, je n'ai rien trouvé dans la librairie STL.
De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C
glob.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie traitant les expressions régulières en C++ mais sans COTS supplémentaire genre Boost.
Suse doit avoir un paquet pour installer boost.
En particulier, je n'ai rien trouvé dans la librairie STL. De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C glob.
les expressions régulières sont dans TR1.
Picard
Je viens de faire une recherche : la librairie TR1 est supportée à partir de la version 10.0 de Suse. Il semblerait que ce soit la première version de Suse supportant un module offrant le support des expressions régulières en C++.
Je pense donc que je vais m'arrêter là dans mes recherches.
Je vous remercie beaucoup pour votre aide et pour le temps que vous avez bien voulu consacrer à répondre à mes questions.
Je viens de faire une recherche : la librairie TR1 est supportée à
partir de la version 10.0 de Suse.
Il semblerait que ce soit la première version de Suse supportant un
module offrant le support des expressions régulières en C++.
Je pense donc que je vais m'arrêter là dans mes recherches.
Je vous remercie beaucoup pour votre aide et pour le temps que vous
avez bien voulu consacrer à répondre à mes questions.
Je viens de faire une recherche : la librairie TR1 est supportée à partir de la version 10.0 de Suse. Il semblerait que ce soit la première version de Suse supportant un module offrant le support des expressions régulières en C++.
Je pense donc que je vais m'arrêter là dans mes recherches.
Je vous remercie beaucoup pour votre aide et pour le temps que vous avez bien voulu consacrer à répondre à mes questions.
kanze
Picard wrote:
Difficile en effet de contester que mon code ressemble plus à du C qu'à du C++. Comme je fais des tests, j'ai simplement repompé le code exemple que j'ai trouvé sur le net et qui est effectivement du C.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie traitant les expressions régulières en C++ mais sans COTS supplémentaire genre Boost.
D'abord, c'est quoi, COTS ? Et Boost est livré avec Mandriva -- c'est peut-être aussi le cas de Suse.
En particulier, je n'ai rien trouvé dans la librairie STL. De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C glob.
Pour la simple raison qu'il n'existe pas. Ni en C ni en C++.
Si vous avez connaissance de telles librairies, je suis intéressé (même si j'ai réussi finalement à faire marcher ce code :je n'ai donc plus besoin d'aide dessus). Là, je pense que c'est une question de langage.
Mais je rappelle cette contrainte forte: je ne peux récupérer d'autres librairies hors celles fournies par défaut avec Linux Suse 9.2 et ce, même si elles sont gratuites comme regex++.
Ça me semble une contrainte assez artificielle. D'une part, même g++ ne fait pas partie du noyau -- c'est quelque chose de plus. Et de l'autre, au moins certaines distributions de Linux inclut Boost.
Ceci dit : ta fonction regex fait partie de Posix. C'est donc du C, pure et simple. Mais c'est assez facile à le wrapper dans une classe C++.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Picard wrote:
Difficile en effet de contester que mon code ressemble plus à
du C qu'à du C++. Comme je fais des tests, j'ai simplement
repompé le code exemple que j'ai trouvé sur le net et qui est
effectivement du C.
Mais cela, c'est par défait car je n'ai trouvé aucune
librairie traitant les expressions régulières en C++ mais sans
COTS supplémentaire genre Boost.
D'abord, c'est quoi, COTS ? Et Boost est livré avec Mandriva --
c'est peut-être aussi le cas de Suse.
En particulier, je n'ai rien trouvé dans la librairie STL. De
même, je n'ai pas trouvé en C++ l'équivalent de la fonction C
glob.
Pour la simple raison qu'il n'existe pas. Ni en C ni en C++.
Si vous avez connaissance de telles librairies, je suis
intéressé (même si j'ai réussi finalement à faire marcher ce
code :je n'ai donc plus besoin d'aide dessus). Là, je pense
que c'est une question de langage.
Mais je rappelle cette contrainte forte: je ne peux récupérer
d'autres librairies hors celles fournies par défaut avec Linux
Suse 9.2 et ce, même si elles sont gratuites comme regex++.
Ça me semble une contrainte assez artificielle. D'une part, même
g++ ne fait pas partie du noyau -- c'est quelque chose de plus.
Et de l'autre, au moins certaines distributions de Linux inclut
Boost.
Ceci dit : ta fonction regex fait partie de Posix. C'est donc du
C, pure et simple. Mais c'est assez facile à le wrapper dans une
classe C++.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Difficile en effet de contester que mon code ressemble plus à du C qu'à du C++. Comme je fais des tests, j'ai simplement repompé le code exemple que j'ai trouvé sur le net et qui est effectivement du C.
Mais cela, c'est par défait car je n'ai trouvé aucune librairie traitant les expressions régulières en C++ mais sans COTS supplémentaire genre Boost.
D'abord, c'est quoi, COTS ? Et Boost est livré avec Mandriva -- c'est peut-être aussi le cas de Suse.
En particulier, je n'ai rien trouvé dans la librairie STL. De même, je n'ai pas trouvé en C++ l'équivalent de la fonction C glob.
Pour la simple raison qu'il n'existe pas. Ni en C ni en C++.
Si vous avez connaissance de telles librairies, je suis intéressé (même si j'ai réussi finalement à faire marcher ce code :je n'ai donc plus besoin d'aide dessus). Là, je pense que c'est une question de langage.
Mais je rappelle cette contrainte forte: je ne peux récupérer d'autres librairies hors celles fournies par défaut avec Linux Suse 9.2 et ce, même si elles sont gratuites comme regex++.
Ça me semble une contrainte assez artificielle. D'une part, même g++ ne fait pas partie du noyau -- c'est quelque chose de plus. Et de l'autre, au moins certaines distributions de Linux inclut Boost.
Ceci dit : ta fonction regex fait partie de Posix. C'est donc du C, pure et simple. Mais c'est assez facile à le wrapper dans une classe C++.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Gabriel Dos Reis
"kanze" writes:
| Picard wrote: | | > Difficile en effet de contester que mon code ressemble plus à | > du C qu'à du C++. Comme je fais des tests, j'ai simplement | > repompé le code exemple que j'ai trouvé sur le net et qui est | > effectivement du C. | | > Mais cela, c'est par défait car je n'ai trouvé aucune | > librairie traitant les expressions régulières en C++ mais sans | > COTS supplémentaire genre Boost. | | D'abord, c'est quoi, COTS ? Et Boost est livré avec Mandriva -- | c'est peut-être aussi le cas de Suse.
C'est le cas.
-- Gaby
"kanze" <kanze@gabi-soft.fr> writes:
| Picard wrote:
|
| > Difficile en effet de contester que mon code ressemble plus à
| > du C qu'à du C++. Comme je fais des tests, j'ai simplement
| > repompé le code exemple que j'ai trouvé sur le net et qui est
| > effectivement du C.
|
| > Mais cela, c'est par défait car je n'ai trouvé aucune
| > librairie traitant les expressions régulières en C++ mais sans
| > COTS supplémentaire genre Boost.
|
| D'abord, c'est quoi, COTS ? Et Boost est livré avec Mandriva --
| c'est peut-être aussi le cas de Suse.
| Picard wrote: | | > Difficile en effet de contester que mon code ressemble plus à | > du C qu'à du C++. Comme je fais des tests, j'ai simplement | > repompé le code exemple que j'ai trouvé sur le net et qui est | > effectivement du C. | | > Mais cela, c'est par défait car je n'ai trouvé aucune | > librairie traitant les expressions régulières en C++ mais sans | > COTS supplémentaire genre Boost. | | D'abord, c'est quoi, COTS ? Et Boost est livré avec Mandriva -- | c'est peut-être aussi le cas de Suse.
C'est le cas.
-- Gaby
Picard
COTS = Component On The Shelf (Composant sur étagères en français).
Boost est livré avec Suse 10.0, pas avec Suse 9.2.
Pour être plus précis, je ne peux utiliser de composant logiciel non offert via l'interface Yast. g++ est proposé via l'interface Yast même s'il n'est pas installé par défaut. Boost n'est pas proposé par l'interface Yast : Il faut explicitement installer Boost en récupérant la librairie sur le net.
Pour ce qui est de la fonction glob, elle existe puisque je l'utilise avec succès (GNU C) et je n'ai installé que les composants logiciels offerts par Yast sur Suse 9.2.
Tout à fait d'accord sur le dernier point.
COTS = Component On The Shelf (Composant sur étagères en français).
Boost est livré avec Suse 10.0, pas avec Suse 9.2.
Pour être plus précis, je ne peux utiliser de composant logiciel non
offert via l'interface Yast.
g++ est proposé via l'interface Yast même s'il n'est pas installé
par défaut.
Boost n'est pas proposé par l'interface Yast : Il faut explicitement
installer Boost en récupérant la librairie sur le net.
Pour ce qui est de la fonction glob, elle existe puisque je l'utilise
avec succès (GNU C) et je n'ai installé que les composants logiciels
offerts par Yast sur Suse 9.2.
COTS = Component On The Shelf (Composant sur étagères en français).
Boost est livré avec Suse 10.0, pas avec Suse 9.2.
Pour être plus précis, je ne peux utiliser de composant logiciel non offert via l'interface Yast. g++ est proposé via l'interface Yast même s'il n'est pas installé par défaut. Boost n'est pas proposé par l'interface Yast : Il faut explicitement installer Boost en récupérant la librairie sur le net.
Pour ce qui est de la fonction glob, elle existe puisque je l'utilise avec succès (GNU C) et je n'ai installé que les composants logiciels offerts par Yast sur Suse 9.2.
Tout à fait d'accord sur le dernier point.
loufoque
Je viens de faire une recherche : la librairie TR1 est supportée à partir de la version 10.0 de Suse.
TR1 est une extension à la bibliothèque standard de C++ qui sortira en 2009 normalement. Je suis assez surpris, donc, que vous l'ayiez déjà.
Je viens de faire une recherche : la librairie TR1 est supportée à
partir de la version 10.0 de Suse.
TR1 est une extension à la bibliothèque standard de C++ qui sortira en
2009 normalement.
Je suis assez surpris, donc, que vous l'ayiez déjà.
Je viens de faire une recherche : la librairie TR1 est supportée à partir de la version 10.0 de Suse.
TR1 est une extension à la bibliothèque standard de C++ qui sortira en 2009 normalement. Je suis assez surpris, donc, que vous l'ayiez déjà.
Picard
En fait, je ne l'ai pas encore puisque je n'ai pas encore Suse 10.0.
De mes investigations, j'ai cru comprendre que TR1 était un composant fourni par Boost: voir lien http://lists.boost.org/boost-announce/2005/09/0070.php
Il se trouve que lorsque je regarde le contenu de la librairie Suse 10.0 (cf http://www.novell.com/products/linuxpackages/professional/boost-doc.html), on y trouve la librairie regex.
Je me suis donc permis ce raccourci même si rien n'indique qu'il s'agit de la librairie TR1. Il peut toutefois s'agir d'une erreur de ma part. Dans ce cas, ne pas hésiter à me le signaler. Après tout, on est là pour apprendre.
En fait, je ne l'ai pas encore puisque je n'ai pas encore Suse 10.0.
De mes investigations, j'ai cru comprendre que TR1 était un composant
fourni par Boost:
voir lien http://lists.boost.org/boost-announce/2005/09/0070.php
Il se trouve que lorsque je regarde le contenu de la librairie Suse
10.0 (cf
http://www.novell.com/products/linuxpackages/professional/boost-doc.html),
on y trouve la librairie regex.
Je me suis donc permis ce raccourci même si rien n'indique qu'il
s'agit de la librairie TR1.
Il peut toutefois s'agir d'une erreur de ma part.
Dans ce cas, ne pas hésiter à me le signaler. Après tout, on est là
pour apprendre.
En fait, je ne l'ai pas encore puisque je n'ai pas encore Suse 10.0.
De mes investigations, j'ai cru comprendre que TR1 était un composant fourni par Boost: voir lien http://lists.boost.org/boost-announce/2005/09/0070.php
Il se trouve que lorsque je regarde le contenu de la librairie Suse 10.0 (cf http://www.novell.com/products/linuxpackages/professional/boost-doc.html), on y trouve la librairie regex.
Je me suis donc permis ce raccourci même si rien n'indique qu'il s'agit de la librairie TR1. Il peut toutefois s'agir d'une erreur de ma part. Dans ce cas, ne pas hésiter à me le signaler. Après tout, on est là pour apprendre.