IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Capturer des sous-chaînes avec regexec


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1
    Par défaut Capturer des sous-chaînes avec regexec
    Bonjour,

    J'ai lu les pages écrites par nicolasj sur developpez.net à propos de REGEX.

    J'ai néanmoins des questions sans réponses, notamment à propos de la capture de sous-chaînes.

    Imaginons le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    const char *str_request = "ADD $2, $3, $4"; /*La chaine a tester*/
    const char *str_regex = "ADD \\$([0-9]), \\$([0-9]), \\$([0-9])"; /* La grammaire */
    [...] regcomp (&preg, str_regex, REG_EXTENDED);
    [...] match = regexec (&preg, str_request, nmatch, pmatch, 0);
          /* regexec retourne 0 en cas de succès */
          if (match == 0) {
            char *chaine = NULL;
            int start = pmatch[0].rm_so;
            int end = pmatch[0].rm_eo;
            size_t size = end - start;
     
            /* Allocation mémoire correspondante, A QUOI ? */        
            chaine = malloc (sizeof (*chaine) * (size + 1));
     
            if (chaine){
              strncpy (chaine, &str_request[start], size);
              chaine[size] = '\0';
              printf ("La chaine capturée est : %s\n", chaine);
              free (chaine);
            }
          }
    Ce code affiche toute la chaine d'origine.
    Or, en ayant mis des parenthèses capturantes autour des [0-9], je souhaiterai les récupérer.
    La question est donc : "Comment accéder aux valeurs récupérées par les parenthèses ?"

    D'avance, merci beaucoup.

  2. #2
    Membre très actif
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Par défaut
    En fait, quand tu captures des chaînes, la première correspond toujours à l'expression entière.

    Donc si tu veux la première sous-chaîne, il te faut prendre l'index 1 et non pas 0.

  3. #3
    Membre très actif Avatar de ZeRevo
    Inscrit en
    Avril 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 302
    Par défaut
    Comme il capture toute la chaine, il doit avoir le même résultat à 0 et à 1

Discussions similaires

  1. [RegEx] Positions des sous-chaînes grâce aux regex
    Par oneTime dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2008, 13h57
  2. Traitement des sous-chaînes
    Par vg-matrix dans le forum Langage
    Réponses: 4
    Dernier message: 03/08/2008, 18h23
  3. Traitement des sous-chaînes
    Par vg-matrix dans le forum Débuter
    Réponses: 1
    Dernier message: 03/08/2008, 02h22
  4. [XI] construire des sous-rapports avec un seul paramétre de saisie
    Par campia dans le forum SAP Crystal Reports
    Réponses: 14
    Dernier message: 15/06/2007, 14h56
  5. Comment gérer des sous ensembles avec des "enum" ?
    Par ogattaz dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2007, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo