sebclick
Messages postés39Date d'inscriptionvendredi 14 mars 2003StatutMembreDernière intervention30 octobre 2008
-
30 oct. 2008 à 16:31
cs_Lucky92
Messages postés180Date d'inscriptionmercredi 22 décembre 2004StatutMembreDernière intervention16 août 2012
-
30 oct. 2008 à 21:31
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"
cs_Lucky92
Messages postés180Date d'inscriptionmercredi 22 décembre 2004StatutMembreDernière intervention16 août 20122 30 oct. 2008 à 21:14
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.
sebclick
Messages postés39Date d'inscriptionvendredi 14 mars 2003StatutMembreDernière intervention30 octobre 2008 30 oct. 2008 à 21:26
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.