Expression régulière POSIX abondante

Signaler
Messages postés
39
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
30 octobre 2008
-
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
-
Bonjour,

Je cherche à traiter un fichier XML par un programme C à l'aide d'expression régulière pour récupérer le texte contenu entre deux balises.

Voici le fichier XML de test :
<root>
        <message>test1</message>
        <message>test2</message>
</root>

Le but est donc de récupérer le texte contenu entre les balises message, à savoir : "test1" puis "test2".

Pour cela, j'inclus la librairie regex.h, puis j'utilise les fonctions regcomp et regexec pour traiter le fichier XML.

Voici l'expression régulière que j'utilise :
<message>(.*)</message>

Problème, les expressions régulières POSIX sont abondantes et le résultat est donc : test1</message><message>test2.

Une solution serait d'utiliser l'expression régulière suivante :
<message>[^<]*</message>
Mais cela ne me convient pas, car mon fichier XML peut contenir d'autres balises entre les balises "message".

J'aimerais donc savoir s'il quelqu'un avait une solution pour que la recherche ne soit pas "abondante"

D'avance, merci.

3 réponses

Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Salut,

Par "abondant", tu veux dire "greedy"/"avide", c'est bien ça ?
Si c'est bien ça, de mémoire, il me semble que tu peux rendre les quantifieurs "nongreedy", en  utilisant le  symbole "?".
toto(.*)titi renvoie la plus grande chaîne commençant par toto et finissant par titi, alors que toto(.*?)titi renvoie la plus petite.

Mais c'est à vérifier et puis c'est pas sûr que posix accepte cette syntaxe.

Cordilalement.
Messages postés
39
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
30 octobre 2008

Merci Lucky92 pour ta réponse.

En effet, par abondant, je voulais dire "greedy"

J'ai testé ce que tu proposes :
Avec les fonctions regcomp et regexec, ça ne fonctionne pas, par contre, cela fonctionne correctement en perl. Mais c'est surement dû au fait que Perl utilise les expressions PCRE...

Pour info, j'utilise regcomp avec le flag REG_EXTENDED.
J'ai fait un test sans, et l'expression régulière ne fonctionne pas du tout.

Je continue à chercher malgré tout.
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Sinon, à moins que tu sois très attaché à la bibliothèque POSIX, tu peux tenter ta chance avec la bibliothèque regex de boost.