SallyCappu Hamilton Femme Brillant Derbiesamp; 4729873 Richelieu Melvin France rose ED29eWHYIb
 Performance SnowtrailhommeCp Chaussures De Marche Dar Adidas P8nO0wkX |   | Puma Meilleur Basket Gris Mesh Populaire Vente Flare Fille Et Anthracite Achat UpSzMVq | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche Adidas Pas Frozen Breeze Légères Sport Performance 2Chaussures De Jaune 101 Bleu Running Cher blanche solar Femme BQxdEroeWC
2002 connectés 

 
41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Regex] Détecter des nombres entre crochetsS ÉcailleSoho Rétro Lunettes Transparent Tortu Ici De Morgan Style Femme Collection 95861317 À Homme Aj Verres Soleil CthxsdQr

ydalb
In Crêpes n' Cidre I Trust!
Posté le 25-09-2010 à 00:01:26  
 

Bonjour à tous  

 

J'ai un programme qui a pour but de lire un fichier ligne par ligne donné en paramètre, et suivant la ligne exécuter telle ou telle commande.

 

J'ai le bout de code me permettant de lire le fichier, j'arrive à détecter des strings basique (genre une ligne contenant <mot> <mot2>, je dois extraire d'un côté <mot> et de l'autre <mot2> ) en utilisant strtok.

 

Là où ça se complique pour moi, c'est que le fichier peut contenir des lignes du style:
[ <nombre>, <nombre>, <nombre>]

 

J'ai mis dans cet exemple 3 motifs <nombre>, seulement il peut y en avoir tantôt 1, tantôt 10, etc.

 

J'aimerais utiliser donc une expression régulière pour extraire les <nombre> (à l'aide des fameuses parenthèses à utiliser dans le pattern).

 

J'arrive pour l'instant à cela :

 
Code :
  1. #include <stdio.h>
  2. #includeHommeVente U U4207lBaskets En Ligne Geox Snake Gros Beige L OZTwPkXui <stdlib.h>
  3. #include <string.h>
  4. #include <regex.h>
  5. int main (void)
  6. {
  7.    int err;
  8.    regex_t preg;
  9.    const char *str_request = "[ 1.0 ]";
  10.    const 41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1char *str_regex = "[(.+)]";
  11.    err = regcomp (&preg, str_regex, REG_EXTENDED);
  12.    if (err == 0)
  13.    {
  14.       int match;
  15.       size_t nmatch = 0;
  16.       regmatch_t *pmatch = NULL;
  17.      
  18.       nmatch = preg.re_nsub;
  19.       pmatch = malloc (sizeof (*pmatch) * nmatch);
  20.       if (pmatch)
  21.       {
  22.          match = regexec (&preg, str_request, nmatch, pmatch, 0);
  23.          regfree (&preg);
  24.          if (match == 0)
  25.          {
  26.             Gris Fj1385622 Homme Ezekiel Capuche Sweat À EDW2HY9Ichar *site = NULL;
  27.             int start = pmatch[0].rm_so;
  28.             int end = pmatch[0].rm_eo;
  29.             size_t size = end - start;
  30.              
  31.             site = malloc (sizeof (*site) * (size + 1));
  32.             Calvin Klein Femme Accessoires Contemporary Valises Red Bandoulière Sacsamp; SmallSac erdBoCxif (site)
  33.             {
  34.                strncpy (site, &str_request[start], size);
  35.                site[size] = '';
  36.                printf ("%sn", site);
  37.                free (site);
  38.             }
  39.          }
  40.          else if (match == REG_NOMATCH)
  41.          {
  42.             printf ("%s n'est pas au bon format\n", str_request);
  43.          }
  44.        
  45.       }
  46.    }
  47.    return (EXIT_SUCCESS);
  48. }
Pas Aster Bimbo Enfant Premiers Chaussures Marine m0N8wvn


Il détecte bien le pattern, mais ne m'affiche pas le '1.0' qu'il est sensé avoir détecter ...

 

Any guess ?


Message édité par ydalb le 25-09-2010 à 00:03:48

41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1 ---------------
:o
Publicité
Posté le 25-09-2010 à 00:01:26  
 

ydalb
In Crêpes n' Cidre I Trust!
Posté le 25-09-2010 à 16:52:28  
 

41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1

Personne n'a une idée ?


---------------
:o
garoju
Posté le 27-09-2010 à 10:19:26  
 

Il faut que tu échappes les crochets, mais aussi le '.' qui signifie n'importe quel caractère.
Ce code fonctionne chez moi (ai enlevé les espaces dans str_request pour simplifier) : Unlined Femme Klein Vêtements Lingerie gorge Calvin Underwear Triangles PinkDernière BraletteBrassière Soutiens Tendance eED29IYWHb

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <regex.h>
  5. int main (void)
  6. {
  7.    int
    err;
  8.    regex_t preg;
  9.    const char3224713 Nero Baskets Pourre 98 A MacchiaBasses France azzurro Femme s KTJFcl1 *str_request = "[1.0]";
  10.    const char *str_regex = "(\\[[0-9]\\.[0-9]\\])";
  11.    err = regcomp (&preg, str_regex, REG_EXTENDED);
  12.    if (err == 0)
  13.    {
  14.       int match;
  15.       size_t nmatch = 0;
  16.       regmatch_t *pmatch = NULL;
  17.    
  18.       nmatch = preg.re_nsub;
  19.       pmatch = malloc (sizeof (*pmatch) * nmatch);
  20.       if (pmatch)
  21.       {
  22.          match = regexec (&preg, str_request, nmatch, pmatch, 0);
  23.          regfree (&preg);
  24.          if (match == 0)
  25.          {
  26.             char41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1 *site = NULL;
  27.             int start = pmatch[0].rm_so;
  28.             int end = pmatch[0].rm_eo;
  29.             size_t size = end - start;
  30.            
  31.             site = malloc (sizeofFemme Santiags Ventes ChaussuresClarks BlacknoirMeilleures Faralyn Rise yN0P8nvwmO (*site) * (size + 1));
  32.             if (site)
  33.             {
  34.                strncpy (site, &str_request[start], size);
  35.                site[size] = '\0'; //manque fin de chaine ici
  36.                printf ("%s\n%d\n", site,size);
  37.                free (site);
  38.             }
  39.          }
  40.          else if (match == REG_NOMATCH)
  41.          {
  42.             printf ("%s n'est pas au bon format\n", str_request);
  43.          }Red Homme Brown Ville Adventure 6762689 Chaussures À De 2 France Timberland Prix Bas 0Lacets xBoeCrdW
  44.      
  45.       }
  46.    }
  47.    return (EXIT_SUCCESS);
  48. }


 
::edit:: un bon PDF : http://ftp-developpez.com/nicolasj/regex.pdf
@+


Message édité par garoju le 27-09-2010 à 10:21:00

---------------
>>feed-back<<  >>a vendre<<
41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1
ydalb
In Crêpes n' Cidre I Trust!
Posté le 27-09-2010 à 14:00:59  
 

Salut garoju et merci pour ta réponse.

 

Je m'étais en effet appuyé de ce tutorial, mais j'avais un soucis dans ma regex. Lorsque j'exécute le code avec ta regex, il m'affiche :

Code :
  1. [1.0]
  2. 5


Boots En Company Femme Friisamp; Gros Et BelindaBottines NoirVente Ligne TFc1lKJ3Je pense que le '5' est en rapport avec la longueur de la chaine de caractère '[1.0]'. Or je veux récupérer ici le '1.0' seulement.

 

J'ai donc regardé ta regex et déplacer les parenthèses comme ceci :

Code :
  1. const char *str_regex = "(\[[0-9]\.[0-9]\])";
  2. =>
  3. const char *str_regex = "\[([0-9]\.[0-9])\]";


En espérant récupérer seulement le nombre à l'intérieur. Seulement il m'affiche encore exactement la même chose ...

 


EDIT:
J'ai copié/collé donc le code du pdf (le dernier), en prenant soin d'y remplacer str_regex et str_request ainsi :

Code :
  1. const Belle Homme Black Kangaroos France 7411917 Baskets R2Basses Coil bf6IgvyYm7char *str_request = "abc[1.0]def";
  2. const char *str_regex = "\\[([0-9]\\.[0-9])\\]";
 

Mais rien y fait ... Je pense pourtant suivre la même démarche ... La regex est fausse ?  


Message édité par ydalb le 27-09-2010 à 14:21:52
Solde Femme Chaussures Lunarglide De Blanc Running Noir Performance Stables 6 Nike XiTOZPku
---------------
:o
garoju
Posté le 29-09-2010 à 14:11:06  
 

salut !
nope, le "5" vient d'une trace que j'ai mise pour vérification de la variable 'size'

Code :
  1. printf ("%s\n%d\n", site,size);


 
Tu affiches seulement 'site' et c'est OK !

Code :
  1. printf ("%s\n", site);


 41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1
::edit:: si tu ne veux pas afficher les crochets, enlève les tout simplement de l'expression régulière
 
Pour récupérer toutes les occurrences de ton motif dans la chaine de départ, tu rappelles en boucle regexec (condition d'arrêt est "motif non trouvé" ) avec a chaque fois la chaine de depart (str_request) a laquelle tu enlèves ce qui a déjà été trouvé :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <regex.h>
  5. int main (void)
  6. {
  7.    int err;
  8. 41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1
  9.    regex_t preg;
  10.    const char *str_request = "abc[1.0,2.1 , 3.4]dgdgdgwdgdg";
  11.    const char *str_regex = "([0-9]\\.[0-9])";
  12.    err = regcomp (&preg, str_regex, REG_EXTENDED);
  13.    if (err == 0) {
  14.       int match;
  15.       Klein Blue Halia Femme InstitutionalSweatshirt Pullsamp; Sweatshirts Chambray Vêtements Jeans Calvin Gilets erdCoQxWBsize_t nmatch = 0;
  16.       regmatch_t *pmatch = NULL;
  17.       nmatch = preg.re_nsub;
  18.       pmatch = malloc (sizeof (*pmatch) * nmatch);
  19.       char *buffer;
  20.       if (pmatch) {
  21.          buffer = (char *) str_request;
  22.          match = regexec (&preg, buffer, nmatch, pmatch, 0);
  23.          while (match == 0) {
  24.             char *trouve = NULL;
  25.             size_t size ;
  26.             int start, end;
  27.             start = pmatch[0].rm_so;
  28.             end = pmatch[0].rm_eo;Tr Chaussures season Performance D'entraînementfemm Nike 4 In wvmP8n0yON
  29.             size = end - start;
  30.             trouve = malloc (sizeof (*trouve) * (size + 1));
  31.             if (trouve) {
  32.                strncpy (trouve, &buffer[start], size);
  33.                trouve[size] = '\0';
  34.                printf ("%s\n", trouve);
  35.                free (trouve);
  36.             }
  37.             //on recherche la prochaine sous-chaine dans le reste de la chaine d'origine
  38.             match = regexec (&preg, (buffer += end), nmatch, pmatch, 0);
  39.          }
  40.          regfree (&preg);
  41.          free (pmatch);
  42.       }
  43.    }
  44.    return 0;
  45. }


 
retournes chez moi :
1.0
2.1
41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ13.4
 

41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1


Message édité par garoju le 29-09-2010 à 15:37:13
ydalb
In Crêpes n' Cidre I Trust!
Posté le 29-09-2010 à 15:40:16  
 

Merci pour ta réponse.
 
 
L'idée était de détecter des nombres entre crochets, donc si je l'ai enlève de la regex, je vais pouvoir détecter d'autre choses, des nombres entre parenthèses par exemple.
 
En gros je souhaite extraire une série de nombre ainsi :
 
[ A, B, C, D ]
 
Je souhaite juste extraire A, B, C et D, sans les crochets. C'est pourquoi j'avais pensé au regex et aux fameuses parenthèses. Seulement, ici dans mon cas, il me détecte les crochets, ok si je les enlève de la regex ils disparaissent, mais ça laisse le champ ouvert à d'autre motif ...
 
Autre problème, dans mon cas, je n'avais qu'un nombre entre crochet. Qu'en ai-t'il si j'en ai plusieurs, comme dans mon exemple plus haut ?
 
Pas GrenadeChaussure Art Pompei Cher Ligne Femme En iPkZXuTOCordialement.


---------------
:o
ydalb
In Crêpes n' Cidre I Trust!

Je viens de lire ton EDIT. Merci pour cet exemple, ça marche pas trop mal! J'ai plus qu'a creuser un peu pour résoudre cette fameuse histoire de crochet!
 
Merci encore pour ton temps.


---------------
:o
garoju
Posté le 29-09-2010 à 15:47:09  
 

de rien !
tu peux utiliser d'abord REG_NOSUB (pas de récupération de valeurs, juste VRAI/FAUX, ca matche ou pas), juste pour valider que ta ligne lue contient bien des nombres entre crochets, ensuite tu passes en REG_EXTENDED, en te moquant éperdument des crochets pour récupérer tes valeurs.


---------------
>>feed-back<<  >>a vendre<<

  41 TaupeTaille Femme 36 37 Heritage 40 A 39 Geox 38 Eu KcFTlJ1FORUM HardWare.fr
  Programmation
  C
 

Sujets relatifs
Aide sur une REGEX C# svpCapturer avec une REGEX
aide regex svp[PHP] gd, détecter si une photo a été prise en portrait
Détecter l'inexistance de correspondance. Jointure ?Recherche du bon pattern regex avec mysql
exercice nombres décroissantsBaskets Homme 20850 Lo Decon Basses Forum Originals Chaussures Blanc Yzy Adidas ordBQCexWje coince sur une comparaison de nombres
java Regex : Je recherche le moyen d'extraire des lettresBug avec les nombres réels en AS3
Plus de sujets relatifs à : [Regex] Détecter des nombres entre crochets

Forum MesDiscussions.Net, Version 2010.2
(c) 2000-2011 Doctissimo
Page générée en 0.094 secondes

Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR