expression régulière [nouveau problème]

expression régulière [nouveau problème] - C - Programmation

Marsh Posté le 04-07-2007 à 20:32:58    

Bonjour
 
Je souhaite pouvoir faire de la vérification de syntaxe en C. Je me suis donc trouné vers le tutoriel suivant http://nicolasj.developpez.com/articles/regex/
 
Mon problème est le suivant:

  • Je n'arrive pas à trouver les bons fichiers nécésaires à l'instalation de cette librairie. En effet j'ai trouvé plusieurs fichiers "regex.h" tous différents et aucun ne me permet de compiler mon code source.  


Mes questions sont donc les suivantes:

  • Quels fichiers ( s'il y en d'autre nécésaire) dois-je télécharger ?
  • Où puis les téléchargers ? ( google est déjà mon ami mais je n'ai pas trouvé la réponse à mon problème)
  • Où dois mettre les fichiers en questions ?


Voila
 
pS: Je code sous Code Blocks sur Windows XP


Message édité par Digaboy le 26-08-2007 à 23:13:05
Reply

Marsh Posté le 04-07-2007 à 20:32:58   

Reply

Marsh Posté le 16-08-2007 à 02:06:56    

Bonjour
 
Après quelques recherches, j'ai trouvé mon fichier regex.h sur une distrib linux mais lorsque je compile , j'obtiens ce message:
 
Linking console executable: D:\code\jap\test_regexp\console.exe
.objs\main.o:main.c:(.text+0x51): undefined reference to `regcomp'
.objs\main.o:main.c:(.text+0x88): undefined reference to `regexec'
.objs\main.o:main.c:(.text+0x96): undefined reference to `regfree'
.objs\main.o:main.c:(.text+0xf4): undefined reference to `regerror'
.objs\main.o:main.c:(.text+0x12b): undefined reference to `regerror'
 
D'où est ce que cela pourrais venir ??

Reply

Marsh Posté le 16-08-2007 à 10:07:10    

Digaboy a écrit :


Après quelques recherches, j'ai trouvé mon fichier regex.h sur une distrib linux mais lorsque je compile , j'obtiens ce message:
 
Linking console executable: D:\code\jap\test_regexp\console.exe
.objs\main.o:main.c:(.text+0x51): undefined reference to `regcomp'
.objs\main.o:main.c:(.text+0x88): undefined reference to `regexec'
.objs\main.o:main.c:(.text+0x96): undefined reference to `regfree'
.objs\main.o:main.c:(.text+0xf4): undefined reference to `regerror'
.objs\main.o:main.c:(.text+0x12b): undefined reference to `regerror'
 
D'où est ce que cela pourrais venir ??


Il faut lier la bibliothèque correspondante au projet. Je dirais libregex.a, (donc ajouter -lregex à la ligne de commande de l'éditeur de lien) mais c'est un peu au pif...
 
Je relis ton message et... non ! Tu n'as pas fait ça ? Tu as été copier un .h comme ça venant de nulle part et tu l'as mis sur ta machine ? T'es fou ?
 
Il faut installer regex sur ta machine, ce qui installera le[s] .h et la bibliothèque qui va bien (et qu'il faura lier avec ton projet).
 
Par exemple, pour MinGW, il ya un devpak http://devpaks.org/details.php?devpak=67
 
Sauf indication contraire, un .h est spécifique à un environnement. De plus, il ne contient que l'interface des fonctions (même si parfois on a tout avec les macros et autres inline).


Message édité par Emmanuel Delahaye le 16-08-2007 à 10:13:30

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-08-2007 à 17:49:16    

Merci pour ta réponse qui ma permis de résoudre mon problème.  
Mais ce qui me parait bizarre c'est que j'avais bien ajouté le fichier libregex.a dans les options de mon linker. Deplus je pensais qu'étant donnée que j'avais le fichier libregex.a, l'ajout d'un fichier regex.h aurait suffit.  
 
Mais passons, voila comment j'ai procédé pour résoudre mon problème :
 
- installations de Rx1.5  dans Code Blocks  
        Plugins -> Dev C++ DevPack Update/installer  
            serveur "devpack.org "
            catégorie "String manipulation"
 
- remplacer #include <regex.h> par #include <rxposix.h>
 
- Project -> Build Option ->linker
     ajouter les fichiers   librx.a    librx.ddl.a         librx.lib
       

Reply

Marsh Posté le 26-08-2007 à 23:12:37    

Re - Bonjour
 
Après quelques manipulations d'expressions régulières, je viens de me heurter à un problème.
 
J'ai les chaines suivantes:

  • [TaHiSe]_Bokurano_02_HDTV_[7253DE30]
  • [TaHiSe] Bokurano 02 HDTV [7253DE30]
  • [TaHiSe]Bokurano02[7253DE30]
  • [SnN]_XXX_Holic_07_[3AF3442A]
  • [SnN] XXX Holic 07 [3AF3442A]


J'arrive à récupérer sans problème le nom de la team ( Tahise ou SnN) et le numéro de l'épisode mais je n'arrive pas à récupérer le nom de la série.
J'ai résumé plus haut différentes manière de nommer un fichiers( et donc les contraintes que j'ai). il faut savoir: le nom peut être composé, séparé par des _ ou des espaces, ...
 
Pour récupérer le nom de la team j'ai utilisé la fonction suivante

Code :
  1. char* isoler_team(char* nom)
  2. {
  3.     char * str_regex = "(([[|\\(][[:alnum:]]+[]|\\)])+)";
  4.     regex_t preg;
  5.     int err = regcomp (&preg, str_regex, REG_NOSUB | REG_EXTENDED);
  6.     if (err == 0)
  7.     {
  8.         int match;
  9.         size_t nmatch = 0;
  10.         regmatch_t *pmatch = NULL;
  11.         nmatch = preg.re_nsub;
  12.         pmatch = malloc (sizeof (*pmatch) * nmatch);
  13.         if (pmatch)
  14.         {
  15.             match = regexec (&preg, nom, nmatch, pmatch, 0);
  16.             regfree (&preg);
  17.             if (match == 0)
  18.             {
  19.                 char *site = NULL;
  20.                 int start = pmatch[0].rm_so;
  21.                 int end = pmatch[0].rm_eo;
  22.                 size_t size = end - start;
  23.                 site = malloc (sizeof (*site) * (size + 1));
  24.                 if (site)
  25.                 {
  26.                     strncpy (site, &nom[start], size);
  27.                     site[size] = '\0';
  28.                     return (site);
  29.                 }
  30.             }
  31.             else exit (EXIT_FAILURE);
  32.         }
  33.         else exit (EXIT_FAILURE);
  34.     }
  35. }


 
mais je ne sais pas comment récupérer le nom.
 
Si vous avez des idées
 

Reply

Marsh Posté le 27-08-2007 à 14:41:26    

Salut pour ma part je ferais tout simplement comme ça :
 

Code :
  1. int i;
  2. ...
  3. i = strchr(nom, ']') - nom + 1;
  4. while(nom[i] != '[')
  5. {
  6.     printf("%c", nom[i]);
  7.     i++;
  8. }


 
En remplaçant le printf par ce que tu veux (avec une petite condition si tu ne veux pas que ça prenne les _ ou espaces s'il y en a)

Reply

Marsh Posté le 29-08-2007 à 21:41:42    

a oui c'est pas bête du tout, j'avais tellement la tête dans mes expressions régulières que j'en oublie les bases.

 

Merci bien


Message édité par Digaboy le 29-08-2007 à 21:42:12
Reply

Marsh Posté le 29-08-2007 à 22:13:28    

j'ai pas poussé loin le test mais j'avais essayé les regex PCRE en C (viens de perl)
y a dla doc itou itou


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed