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 :

Parser de string


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut Parser de string
    Salut,

    J'aimerais réaliser une fonction qui, à partir d'un string passé en parametre, réalise les opérations suivantes :
    - Récupère la sous_chaine entre les mots "SI" et "ALORS" de la chaine
    - Dans cette sous_chaine, sépare tout les mots avec comme séparateur le string "ET" et récupère chaque sous_sous_chaine dans un tableau de string
    - Pour chaque string du tableau extrait les 2 string séparés par un opérateur (typiquement := ou > ou <).

    En gros, à partir de cette chaine:

    SI mot1:=valeur1 et mot2>valeur2 Alors mot3<Valeur3

    J'obtients
    1/ "mot1:=valeur1 et mot2>valeur2"
    2/ "mot1:=valeur1";"mot2>valeur2"
    3/ "mot1";":=";"valeur1"
    "mot2";">";"valeur2"

    Voila mon code:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    void parsecond(string LigneAParser){
          string cond;
          // Mettre en majuscule
          transform(LigneAParser.begin(), LigneAParser.end(), LigneAParser.begin(), 
                                   static_cast<int (*)(int)>(toupper));
     
          // Parse la LigneAParser entre le "si" et le "alors"
          size_t deb = LigneAParser.find("SI",0)+3;
          cout<<deb;
          getchar();
          size_t fin = LigneAParser.find("ALORS")-3;
          cout<<"\n"<<fin;
          getchar();
          cond = LigneAParser.substr(deb,fin);
          cout<<cond<<endl;
     
          // Parse les "et" dans la sous chaine récupérée
          int k=0;
          string tab[10];
          size_t sep;
          while(cond.find("ET")==true){
             sep = cond.find("ET");
             cout<<sep<<"huhu"<<endl;
             getchar();
             tab[k] = cond.substr(0,sep-1);
             cout<<"Iteration :"<<k<<" "<<tab[k]<<endl;
             getchar();
             cout<<cond<<"haha"<<endl;
             cond.erase(0,sep+3);
             cout<<cond<<"hihi"<<endl;
             getchar();
             if(k==9) break;
    	     k++;
          }
    }
    mais je n'arrive pas à séparer les mots autour de ET.
    J'ai vu dans la FAQ des choses concernant boost::tokenizer
    Quelqu'un peut il m'éclairer plus sur cette méthode et me dire si ca pourrait convenir à mon problème ?

    Merci beaucoup à tous

    Oti$

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    boost.spirit est sûrement la bonne solution.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Comme je commence à peine à m'intéresser à la bibliotheque boost, je peux me tromper, mais il semblerait que, effectivement, ce soit tip-top ce que tu cherches
    Un code (inclusions comprises) pour la ligne que tu donnes en exemple, du genre de
    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
     
    #include <iostream>
    #include <boost/tokenizer.hpp>
    #include <string>
     
    int main()
    {
      std::string str = "SI mot1:=valeur1 et mot2>valeur2 Alors mot3<Valeur3";
      typedef boost::tokenizer<boost::char_separator<char> >
        tokenizer;
      boost::char_separator<char> sep(" ");
      tokenizer tokens(str, sep);
      for (tokenizer::iterator tok_iter = tokens.begin();
           tok_iter != tokens.end(); ++tok_iter)
        std::cout << "<" << *tok_iter << "> ";
      std::cout << "\n";
      return EXIT_SUCCESS;
    }
    te donnerait une sortie du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Si> <mot1:=valeur> <et> <mot2>valeur2> <Alors> <mot3<Valeur3>
    (parce que le code demande expressément, ici, d'entourer les terme de < et > )

    Si, en plus, tu prévois une gestion spéciale pour les "termes spéciaux" (ici: Si, et et Alors), ou que tu considère les caracteres =,< et > (et peut etre d'autres, comme ( { etc) comme séparateurs potentiels (par exemple ) tu pourras parser tes chaines selon ta bonne convenance...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    sinon en plus simple tu avais la fonction split sur le caractere espace, ça te renvoie un tableau de strings avec dans chaque case un des mots, apres ça devient trivial.

    Maintenant il est toujours bien d'apprendre a utiliser des bibliothèques comme boost.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    L'avantage de boost::spirit est que tu construis un vrai parser, avec la description de ta grammaire et les actions à effectuer sur chacun des tokens, de façon lisible et extensible. Il vaut mieux être familier avec les techniques de programmation générique avant de se lancer dedans, même si les examples fournis sont suffisaments explicites pour comprendre le fonctionnement de la chose.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Bah spirit c'est une syntaxe EBNF-like, tout ce qu'il y a de plus classique.

  7. #7
    Membre chevronné Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Par défaut
    Pour ce que tu veux faire les expressions régulières sont bien plus adaptées. Je n'ai encore jamais utilisé les regexps avec C++, mais il me semble qu'avec Boost c'est possible alors autant les utiliser.

Discussions similaires

  1. [DOM] Parser un String et non un fichier
    Par Zenol dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/04/2006, 12h20
  2. [XML] [string] parser une string XML
    Par fxp17 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 29/03/2006, 10h27
  3. Parser un String
    Par pittacos dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/10/2005, 13h26
  4. [DOM] Parser une string
    Par judi_kl dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 19/11/2004, 11h06
  5. [DOM] parser une String pour en faire un document XML
    Par Fladnag dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 29/03/2004, 11h04

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