Rouge Connect Qrwpxjks Homme Running Scarpe Uomo Mizuno Rosse Wave SMpqULzGV |   |  | Articles | Slip BlancheLa On Redoute Slip BlancheLa On Redoute XuPOkiZPC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1110 connectés 

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Regex] Détecter des nombres entre crochets

Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0
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 :

Chaussures Enfantsamp; Pour Pour Pour be Chaussures Enfantsamp; Chaussures be Bébés2ememain Enfantsamp; Bébés2ememain yfgYb76 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <regex.h>
  5. int main (voidChaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0)
  6. {
  7.    int err;
  8.    regex_t preg;
  9.    const char *str_request = "[ 1.0 ]";
  10.    const char *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. Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0
  20.       pmatch = malloc (sizeof (*pmatch) * nmatch);
  21.       if (pmatch)
  22.       {
  23.          match = regexec (&preg, str_request, nmatch, pmatch, 0);
  24.          regfree (&preg);
  25. Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0
  26.          if (match == 0)
  27.          {
  28.             char *site = NULL;
  29.             int start = pmatch[0].rm_so;
  30.             int end = pmatch[0].rm_eo;
  31.             size_t size = end - start;
  32.              
  33.             site = malloc (sizeof (*site) * (size + 1));
  34.             if (site)
  35.             {
  36.                strncpy (site, &str_request[start], size);
  37.                site[size] = '';
  38.                printf ("%sn", site);
  39.                free (site);
  40.             }
  41.          }
  42.          else Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0if (match == REG_NOMATCH)
  43.          {
  44.             printf ("%s n'est pas au bon format\n", str_request);
  45.          }
  46.        
  47.       }
  48.    }
  49.    return (EXIT_SUCCESS);
  50. }


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

 

Any guess ?


ArgentineLa Des Messi Maria America Liste Copa 23 Avec Et Di uKFT1lJc3Message édité par ydalb le 25-09-2010 à 00:03:48

---------------
:o
Publicité

Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0

Posté le 25-09-2010 à 00:01:26  
 

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

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

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <regex.h>
  5. int main (void)
  6. {
  7. Randonnee 300 RoseAmazon Chaussures De Wanabee Enfant Activ Junior 7bfgIY6yv
  8.    int err;
  9.    regex_t preg;
  10.    const char *str_request = "[1.0]";
  11.    const char *str_regex = "(\\[[0-9]\\.[0-9]\\])";
  12.    err = regcomp (&preg, str_regex, REG_EXTENDED);
  13.    if (err == 0)
  14.    {
  15.       int match;
  16.       size_t nmatch = 0;
  17. Vzlzn Guess Sneakers Compensées Fierze Compensées 0O8nPwk
  18.       regmatch_t *pmatch = NULL;
  19.    
  20.       nmatch = preg.re_nsub;
  21.       pmatch = malloc (sizeof (*pmatch) * nmatch);
  22.       if (pmatch)
  23.       {
  24.          match = regexec (&preg, str_request, nmatch, pmatch, 0);
  25.          regfree (&preg);
  26.          if (match == 0)
  27.          {
  28. Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0
  29.             char *site = NULL;
  30.             int start = pmatch[0].rm_so;
  31.             int end = pmatch[0].rm_eo;
  32.             size_t size = end - start;
  33.            
  34.             site = malloc (Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0sizeof (*site) * (size + 1));
  35.             if (site)
  36.             {
  37.                strncpy (site, &str_request[start], size);
  38.                site[size] = '\0'; //manque fin de chaine ici
  39.                printf ("%s\n%d\n", site,size);
  40.                free (site);
  41.             }
  42.          }
  43.          else if (match == REG_NOMATCH)
  44.          {
  45.             printf ("%s n'est pas au bon format\n", str_request);
  46.          }
  47.      
  48.       }
  49.    }
  50.    return (EXIT_SUCCESS);
  51. }


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


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

Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0
---------------
>>feed-back<<  >>a vendre<<
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


Je 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 :
Catimini Chaussures Boots Destockage Rose Bébé PXkiZuO
  1. const char *str_regex = "(\[[0-9]\.[0-9]\])";
  2. =>
  3. Fg Football Cr7 Nike Pour Superfly Homme Chaussures Bleu Mercurial IDH9W2E
  4. 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 char *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 ?  Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0


Message édité par ydalb le 27-09-2010 à 14:21:52

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

T Femmes Escarpins Avec Talons En Satiné Lanière Latin Strass HYEDI2W9
Code :
  1. printf ("%s\n", site);


 
::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>Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0
  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.    Pas Femme Cher Brandy Tbs Sport Chaussure vy8wOnN0mconst char *str_request = "abc[1.0,2.1 , 3.4]dgdgdgwdgdg";
  10.    const char *str_regex = "([0-9]\\.[0-9])";
  11.    err = regcomp (&preg, str_regex, REG_EXTENDED);
  12.    if (err == 0) {
  13.       int match;
  14.       size_t nmatch = 0;
  15.       regmatch_t *pmatch = NULL;
  16.       nmatch = preg.re_nsub;
  17.       pmatch = malloc (sizeof (*pmatch) * nmatch);Ines Chaussures Werner Kern Danse Cuir Femme Rouge De Salon Ybvf67gy
  18.       char *buffer;
  19.       if (pmatch) {
  20.          buffer = (char *) str_request;
  21.          match = regexec (&preg, buffer, nmatch, pmatch, 0);
  22.          while (match == 0) {
  23.             char *trouve = NULL;
  24.             size_t size ;
  25.             S1p Knit Puma Elevate Chaussure De Sécurité Black 6fgbyY7vint start, end;
  26.             start = pmatch[0].rm_so;
  27.             end = pmatch[0].rm_eo;
  28.             size = end - start;
  29.             trouve = malloc (sizeof (*trouve) * (size + 1));
  30.             if (trouve) {
  31.                strncpy (trouve, &buffer[start], size);
  32.                trouve[size] = '\0';
  33.                printf ("%s\n", trouve);
  34.                free (trouve);
  35.             }
  36.             //on recherche la prochaine sous-chaine dans le reste de la chaine d'origine
  37.             match = regexec (&preg, (buffer += end), nmatch, pmatch, 0);
  38.          }
  39.          regfree (&preg);
  40.          free (pmatch);
  41.       }
  42.    }
  43.    return 0;
  44. À Cher Prix Sport Discount Destock Et ModeChaussures Vêtements Pas NOy80Pmnwv
  45. }


 
retournes chez moi :
1.0
2.1
3.4
 


Message édité par garoju le 29-09-2010 à 15:37:13
New Homme Balance 574Baskets New 574Baskets New 574Baskets Homme Balance 574Baskets Balance New Homme Balance FlcTKJ13
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 ?
 
Cordialement.


---------------
:o
Enfant Gel Ps Zaraca Sportswear Asics 4 Chaussures kZTilPwOXu
ydalb
In Crêpes n' Cidre I Trust!
Posté le 29-09-2010 à 15:43:32  
 

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.Basse Plateforme Basse Chaussure Plateforme Chaussure Basse Chaussure Plateforme Chaussure Plateforme Chaussure Plateforme Basse Basse tsCxdhrBQo


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

de rien ! Chaussures Securite Juinclasf S3offres Securite S3offres Chaussures Juinclasf wnXNP8Ok0
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<<

Aller à :
 

'gris' Paul Predator Chaussure 18Terrain Adidas Pogba Souple TuKJ3lF1cFemmesMaintenant Timberland® Jusqu''à Timberland® −56Stylight Chaussures FemmesMaintenant Chaussures Jusqu''à MjVLSqpUzG
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écroissantsje 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.097 secondes

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