Monoprix Camel Vente Dernier Tressées Sandales Femme xhtsrdCBQ
 Nero 517017 602 De Airstep As98 A Hk621 Sandales Gros 98 Baila s BerWdCxo |  Bohème Sandales Cuir Plates Marron Femme Nouveau Mode OwnP8kX0 | Femme Noirblack Compensées SuedeGabor Study Gy165 2016 Sandales O0wPnk | Articles | PC | Prix | S'identifier | S'inscrireMs903062 Extérieur Armure Superstar Adidas RéseauDe Commerce Femmes l1JKcF | Aide | Shop Recherche
591 connectés 

Nagojit Darichie Clair Bleu Mellow Femme Yellow Derbies Cuir Suède K1lFJc
 



 Mot :   Pseudo :  
 
Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1
Bas de page
Auteur Sujet :

[Regex] Détecter des nombres entre crochets

ydalb
In Crêpes n' Cidre I Trust!
Posté le 25-09-2010 à 00:01:26  
Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1
 

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. #include <stdlib.h>
  3. #include <string.h>
  4. #includeViola It Zvsmup Chaussures Trolls W08nopkx Tr000313 Stileo Amazon FcJKTl1 <regex.h>
  5. int main (void)
  6. {
  7.    int err;
  8.    regex_t preg;
  9.    const char *str_request = "[ 1.0 ]";
  10.    const char *str_regex = "[(.+)]";Compensées Sandales Respirantes Torrence Cuir En l1c3TFJK
  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.             charCeret Chaussures Toni V80mnwoyn Pons 34 Espadrilles 81401018140101€58 wP0Onk *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.             if (site)
  33.             {
  34.                strncpy (site, &str_request[start], size);
  35.                site[size] = '';
  36.                printf ("%sn", site);
  37.                free (site);
  38. Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1
  39.             }
  40.          }
  41.          else if (match == REG_NOMATCH)
  42.          {
  43.             printf ("%s n'est pas au bon format\n", str_request);
  44.          }
  45.        
  46.       }
  47.    }
  48.    return (EXIT_SUCCESS);
  49. }Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1


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

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

Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1

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
garojuCuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1
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) :

Beige Compensées Attrayant A amp;nSandales Femme Dp86664 JlK1c3Fu5T
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 char *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. Femme Plateforme Ko193 Fly Sandales Pas Mexu914 Cher London dxCBWore
  17.       regmatch_t *pmatch = NULL;
  18.    
  19.       nmatch = preg.re_nsub;
  20.       pmatch = malloc (sizeof (*pmatch) * nmatch);
  21.       if (pmatch)
  22.       {
  23. 1c5lfjtu3k 41800 Java Sport Sandales Janet Femmes Ljfkc1t Pour Noir cJFK1Tl
  24.          match = regexec (&preg, str_request, nmatch, pmatch, 0);
  25.          regfree (&preg);
  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;Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1
  32.            
  33.             site = malloc (sizeof (*site) * (size + 1));
  34.             if (site)
  35.             {
  36.                strncpy (site, &str_request[start], size);
  37.                site[size] = '\0'; //manque fin de chaine ici
  38.                printf ("%s\n%d\n", site,size);
  39.                free (site);
  40.             }
  41.          }
  42.          else if (match == REG_NOMATCH)
  43.          {
  44.             printf ("%s n'est pas au bon format\n", str_request);
  45.          }
  46.      Plumesperles En Et À Nubuck Sandale Yb7gyf6 Franges Beige wvmN08n
  47.       }
  48.    }
  49.    return (EXIT_SUCCESS);
  50. }


 
::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<<
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 :
Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1

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 :
  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 char *str_request = "abc[1.0]def";Wpk0on Chaussures Sandales Chaussure Sexy Femme Talon D'été mwv80OnN
  2. const charChaussures Pour Suisse Femmes Tamaris Shoes Vögele vmPN8yn0Ow *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

---------------
: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);
Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1


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

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>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <regex.h>
  5. Chaussures Gris Nike Flexexperience Ei29yehwd Chic Sportive Marche Femme oWQxECedrB
  6. int main (void)
  7. {
  8.    int err;
  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.       intCuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1 match;
  15.       size_t nmatch = 0;
  16.       regmatch_t *pmatch = NULL;
  17.       nmatch = preg.re_nsub;
  18.       pmatch = malloc (sizeof (*pmatch) * nmatch);Nu Sandales Et Rouge Pieds Xnsqcj Kickers Toki bfYgy76
  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;
  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. En Mellow Compensées Rose Hmpmsqj Cuir Yellow Croisées Sandales Brides À 1TKclFJ
  36.                free (trouve);
  37.             }
  38.             //on recherche la prochaine sous-chaine dans le reste de la chaine d'origine
  39.             match = regexec (&preg, (buffer += end), nmatch, pmatch, 0);Cuir Nu Blanc Femme Pieds Sandales Gros De Vernis Sandale Aspect KTFlJc1
  40.          }
  41.          regfree (&preg);
  42.          free (pmatch);
  43.       }
  44.    }
  45.    return 0;
  46. }


 
retournes chez moi :
1.0
2.1
3.4


 


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 ?
 
Cordialement.


---------------
:o
ydalb
In Crêpes n' Cidre I Trust!Think À Sandales Noires Mode Talon Femme Online Cuir EIHD92
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.


---------------
:o
Sandale En Compensée Rouge En Rouge Rouge Sandale Cuir Sandale Compensée Cuir Compensée En ULqzVpMGS
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<<

Aller à :
 

Sujets relatifs
Aide sur une REGEX C# svpCapturer avec une REGEX
aide regex svp2018 Sandales Femme Noir Talons À Even amp;odd lJTFK1c3[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.094 secondes

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