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

Boost C++ Discussion :

[regex] flag /g


Sujet :

Boost C++

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2003
    Messages : 54
    Points : 65
    Points
    65
    Par défaut [regex] flag /g
    Bonjour à tous...

    À nouveau un petit problème sur un thème que je ne maîtrise pas bien du tout : les regex... Alors voici mon problème...

    J'ai un tableau de std::string au format suivant, pour lesquelles je souhaite extraire chaque valeur numérique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4354	10885	3536	3536	22	0	620	0
    4354	10885	3536	3536	22	0	620	0	
    4354	10885	3536	3536	22	0	620	0
    Je me suis dit que c'était un travail de regex, mais j'en ch*e

    Voici mon code avec la regex que je tente de mettre au point :
    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
    //string regex_str = R"((\S+)[\t\n]/g)";
    string regex_str = R"((\S+)[\t\n])";
    boost::regex reg(regex_str);
     
    for(auto &line : file_dataset)
    {
      // Extract data
      /* 'line' contient la ligne de texte présentée ci-dessus */
        boost::smatch results;
        //if(!boost::regex_match(line, results, reg))
        if(!boost::regex_match(line, results, reg, boost::match_any))
        {
          cerr << "* " << line << endl;
          continue;
        }
     
        // Data processing
          [...]
    }
    Pour chaque ligne de texte, la fonction ne me retourne aucun champ exploitable (on boucle avec continue). J'ai essayer plusieurs forme de formule regex, ainsi que quelques paramètres au niveau de l'appel regex_match mais en vain.

    Avant de me lancer dans l'exploitation de cette reger, je l'ai testé en ligne sur le site https://regex101.com. Avec l'option /g, cette regex est pleinement fonctionnelle.

    Avez vous des pistes de réflexion sur cette utilisation ? Le testeur de regex est en mode PCRE, mais je ne sais pas si boost_regex est dans le même mode ni comment lui demander...


    de vos précieux conseils !

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2003
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Suite aux dernière recherche, j'ai trouver une formulation de ce type :
    Là encore, j'ai bien un résultat avec le testeur, mais après mûre réflexion, il semblerait que ce soit un résultat par match et non un match comprenant plusieurs groupes capturés...

    Comme si la piste serait une boucle dans la regex, mais google m’emmène partout lorsque je lui demande un "regex loop" ...

    C'est quand même pas évident les regex au premier abord


    chaud chaud chaud

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je ne suis pas expert en C++, mais à mon avis tu te casses la tête pour rien. Ton fichier n'est ni plus ni moins que du csv (des lignes avec le même nombre de champs séparés dans ton cas par une tabulation). Il serait plus simple de séparer ces champs plutôt que de les chercher, autrement dit de spliter la ligne en utilisant la tabulation comme séparateur.

    D'autre part boost::regex_match réussit uniquement si la pattern décrit la chaîne de bout en bout, ce qui n'est pas le cas ici. Pour trouver des sous-chaînes, c'est plutôt boost::regex_search qu'il faut utiliser. Pour spliter avec une regex, tourne toi vers boost::regex_token_iterator, mais dans ton cas tu dois pouvoir te passer de regex.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    C'est un travail pour strtol et co.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu as un tableau de std::string sur lequel appliquer strtol/atoi sur chaque élément ?
    Ou tu as un fichier sur lequel utiliser l'oéprateur>> du stream de lecture ?

    Dans tous les cas, t'aimes faire compliqué, ce n'est pas du tout un travail de regexp.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    et un while(std::getline(stream, string, '\d')), ou stream est un istringstream sur la ligne entiere?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2003
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    PAN

    Mais carrément ! J'avais pas du tout pensé à ça, d'autant plus qu'il sagit d'une solution que j'utilise pour le traitement de mes trames de communication.

    Merci de l'idée. En plus, ça va carrément plus vite sur mes gros fichiers de données. C'est dommage, je commençais à aimer le regex ...

    Bon week...


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33
  2. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  3. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  4. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24
  5. Flags ??
    Par foussa dans le forum Assembleur
    Réponses: 21
    Dernier message: 19/10/2002, 18h36

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