OVH Cloud OVH Cloud

Extraire les composantes d'une expression régulière ?

22 réponses
Avatar
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.

Merci par avance pour votre aide.


#include "regex.h"

....

const char* l__pattern =
"([:alnum:_]+)_([:digit:]+)-([:digit:]+)x([:digit:]+)";
regex_t l__regex;
int l__rc = regcomp(&l__regex,l__pattern,REG_EXTENDED);
if (0 == l__rc)
{
int l__match;
size_t l__nmatch = 0;
regmatch_t *l__pmatch = NULL;
l__nmatch = l__regex.re_nsub;
cout << "nmatch = " << l__nmatch << endl;
l__pmatch = (regmatch_t *)malloc (sizeof (*l__pmatch) * l__nmatch);

l__match = regexec (&l__regex, l__file, l__nmatch, l__pmatch, 0);
regfree (&l__regex);
if (0==l__match)
{
cout << "filename " << l__file << " matches the file naming rule"
<< endl;
char *site = NULL;
int start = l__pmatch[0].rm_so;
int end = l__pmatch[0].rm_eo;
size_t size = end - start;
site = (char *)malloc (sizeof (*site) * (size + 1));
cout << "start="<<start<<" end="<<end << " size=" << size << endl;
memset(site,0,sizeof (*site) * (size + 1));
if (site)
{
strncpy (site, &l__file[start], size);
printf ("%s\n", site);
}
}
else
{
cout << "filename " << l__file << " does not match the file naming
rule" << endl;
}
}

10 réponses

1 2 3
Avatar
Franck Branjonneau
"Picard" écrivait:

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


Tu l'as lu ?

"The TR1 library provides an implementation of the C++ Technical
Report on Standard Library Extensions. This library does not itself
implement the TR1 components, rather it's a thin wrapper that will
include your standard library's TR1 implementation (if it has one),
otherwise it will include the Boost Library equivalents, and import
them into namespace std::tr1."

TR1 est un document ISO.

--
Franck Branjonneau

Avatar
Gabriel Dos Reis
loufoque writes:

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

j'espère que tout TR1 qui N'ira PAS dans C++0x.

-- Gaby
Avatar
Gabriel Dos Reis
"Picard" writes:

| COTS = Component On The Shelf (Composant sur étagères en français).
|
| Boost est livré avec Suse 10.0, pas avec Suse 9.2.

Boost est livrée avec SuSE 9.3.

-- Gaby
Avatar
Gabriel Dos Reis
"Picard" writes:

| g++ est proposé via l'interface Yast même s'il n'est pas installé
| par défaut.

qu'est-ce que tu appelles « par défaut » ?

Par défaut, j'ai tout l'environnement de développement GNU et consorts
(et je dois même demander explicitement pour NE PAS avoir Eclipse et
autres « par défaut. »)

-- Gaby
Avatar
Loïc Joly
loufoque writes:

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

j'espère que tout TR1 qui N'ira PAS dans C++0x.


Quelle partie en particulier souhaites tu ne pas voir transmise ?
(au hasard, je dirais type_traits, pour laquelle les concepts devraient
à ce que j'ai compris demander un dépoussièrage certains, mais
j'aimerais une confirmation)

--
Loïc

Avatar
kanze
Picard wrote:
COTS = Component On The Shelf (Composant sur étagères en français ).


Sauf qu'en anglais, on dirait plutôt un « off the shelf
component » (c-à-d un composant tout fait et disponible à tout
le monde -- le « shelf » dont il est question ici n'est pas
l'étagère, mais l'étalage d'un magasin ou le rayon dans un
supermarché).

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.


Ça fait un moment que je ne me suis plus servi de Suse, mais si
je me rappelle bien, Yast permet l'accès à tous les composants
livrés avec le système. Donc, Boost, avec une version plus
récente de Suse.

Mais ça me semble toujours une restriction assez arbitraire.
Qu'est-ce que tu fais si la version proposée par Yast ne marche
pas ? (C'est le cas de beaucoup de choses sous Mandriva -- alors
que la version téléchargée du reseau fonctionne très bien.)

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)


Mais c'est une extension aussi, aussi bien, sinon plus, que
Boost. Il ne fait pas partie de C, ni de C++. Ni de Posix, ni de
quoique ce soit d'autre que je connais. En somme, avec Boost, tu
reste rélativement portable, tandis qu'avec glob, tu peux être
sûr que ton programme ne fonctionne pas ailleurs.

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

Avatar
Gabriel Dos Reis
Loïc Joly writes:

| > loufoque writes:
| > | > 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.
| > j'espère que tout TR1 qui N'ira PAS dans C++0x.
|
| Quelle partie en particulier souhaites tu ne pas voir transmise ?

laisser tomber certains header "C", fallacieusement introduits pour
des « raisons » de compatibilité.

| (au hasard, je dirais type_traits, pour laquelle les concepts
| devraient à ce que j'ai compris demander un dépoussièrage certains,
| mais j'aimerais une confirmation)

je pense que certains de ces traits disparaîtront d'eux même si on a
les concepts.

<rant>
Mon impression générale est que TR1 est essentiellement (à l'exception
de regex), un truc fait pour écrivain spécialiste de bibliothèque. Le
comité de moins en moins tolérance pour les novices ou les gens moins
spécialisées. Il oublie que dans une communauté bien portante, la
proportion de novices / débutants est généralement plus grande que
celle des experts.
</rant>

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

<rant>
Mon impression générale est que TR1 est essentiellement (à l'exception
de regex), un truc fait pour écrivain spécialiste de bibliothèque.


Tu exageres un petit peu. smart_ptr, unordered_map, meme array sont
d'utilisation plus large que ca.

Le comité de moins en moins tolérance pour les novices ou les gens
moins spécialisées. Il oublie que dans une communauté bien portante,
la proportion de novices / débutants est généralement plus grande
que celle des experts.


J'ai l'impression aussi que le langage est pousse vers les templates
en oubliant parfois un peu les autres "paradigmes"... mais c'est
peut-etre parce que le support de ces autre paradigmes est mur tandis
qu'avec les templates on en est encore dans une phase de consolidation
des possibilites.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > <rant>
| > Mon impression générale est que TR1 est essentiellement (à l'exception
| > de regex), un truc fait pour écrivain spécialiste de bibliothèque.
|
| Tu exageres un petit peu. smart_ptr, unordered_map, meme array sont
| d'utilisation plus large que ca.

J'accepte très volontiers unordered_map -- c'était plus un oubli qu'un
désir de l'écarter.

smart_ptr est très limite pour une autre raison : j'ai vu beaucoup de
gens l'utiliser sans réfléchir et sans tenir compte des performances
réellement. En Avril 2004, j'ai assisté à un exposé de Hans Boehm où
il comparait les performances de smart_ptr, de son GC et d'une autre
technique dans plusieurs applications. smart_ptr est lamentable -- et
je ne suis pas surpris quand tu analyses ce qui se passe.

| > Le comité de moins en moins tolérance pour les novices ou les gens
| > moins spécialisées. Il oublie que dans une communauté bien portante,
| > la proportion de novices / débutants est généralement plus grande
| > que celle des experts.
|
| J'ai l'impression aussi que le langage est pousse vers les templates
| en oubliant parfois un peu les autres "paradigmes"... mais c'est
| peut-etre parce que le support de ces autre paradigmes est mur tandis
| qu'avec les templates on en est encore dans une phase de consolidation
| des possibilites.

Dans ce cas, je reste dubitatif en ce qui concerne la plupart des
traits et le genre de paradigme que que le standard promulguerait.
Pour le moment, ces traits m'apparaissent plus comme outils pour les
développeurs avancés de bibliothèques qu'un réel support d'un
paradigme de programmation.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > <rant>
| > Mon impression générale est que TR1 est essentiellement (à l'exception
| > de regex), un truc fait pour écrivain spécialiste de bibliothèque.
|
| Tu exageres un petit peu. smart_ptr, unordered_map, meme array sont
| d'utilisation plus large que ca.

J'accepte très volontiers unordered_map -- c'était plus un oubli qu'un
désir de l'écarter.

smart_ptr est très limite pour une autre raison : j'ai vu beaucoup de
gens l'utiliser sans réfléchir et sans tenir compte des performances
réellement. En Avril 2004, j'ai assisté à un exposé de Hans Boehm où
il comparait les performances de smart_ptr, de son GC et d'une autre
technique dans plusieurs applications.


La quelle? Est-ce que c'est sur son site?

(J'ai des objets avec comptages de reference, mais interne d'une part,
et je ne suis pas en multithread d'autre part).

smart_ptr est lamentable -- et
je ne suis pas surpris quand tu analyses ce qui se passe.

| > Le comité de moins en moins tolérance pour les novices ou les gens
| > moins spécialisées. Il oublie que dans une communauté bien portante,
| > la proportion de novices / débutants est généralement plus grande
| > que celle des experts.
|
| J'ai l'impression aussi que le langage est pousse vers les templates
| en oubliant parfois un peu les autres "paradigmes"... mais c'est
| peut-etre parce que le support de ces autre paradigmes est mur tandis
| qu'avec les templates on en est encore dans une phase de consolidation
| des possibilites.

Dans ce cas, je reste dubitatif en ce qui concerne la plupart des
traits et le genre de paradigme que que le standard promulguerait.
Pour le moment, ces traits m'apparaissent plus comme outils pour les
développeurs avancés de bibliothèques qu'un réel support d'un
paradigme de programmation.


Je parlais aussi de core. Et la seule solution pour un support d'un
paradigme de programmation est dans core. Pas dans les bibliotheques.
Mais nous sommes d'accord si j'en crois:

je pense que certains de ces traits disparaîtront d'eux même si on a
les concepts.



--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

1 2 3