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 :

Boost Regex [Débutant(e)]


Sujet :

Boost C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Par défaut Boost Regex
    Bonjour,

    j'ai quelques petits problèmes avec les expressions régulières et boost.
    J'ai suivi pas à pas, ce beau tutoriel qui tourne parfaitement.
    Après j'ai commencé à vouloir écrire quelques petites expressions régulières, et c'est la que les ennuis ont commencé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::string regexsimple = "([0-9]*)((;)([0-9]*))*";   
     check("set Regex", regex, val, regex.SetRegex(regexsimple));  
     check("Match Regex", regex, val, regex.Match("1;10;20;21;23;25", val) );
    Et c'est le drame, j'obtiens en console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            set Regex : OK
            Match Regex : OK
            Array[0] = 1;10;20;21;23;25
            Array[1] = 1
            Array[2] = ;25
            Array[3] = ;
            Array[4] = 25
    mon problème c'est que j'aimerai avoir bien sur en retour mes chiffres, bien séparés les uns des autres.
    j'ai l'impression qu'avec le caractère *, il ne match que la dernière sous chaine trouvée.

    merci de votre aide.

  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
    Le nombre de résultats d'une regex dépend uniquement du nombre de parenthèses capturantes dans le motif, pas de la taille de la chaîne.
    Il faut changer le motif et itérer tous les résultats possibles, ou tout simplement faire une tokenization sur ;.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par ooxoo Voir le message
    J'ai suivi pas à pas, ce beau tutoriel qui tourne parfaitement.
    Merci
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Le nombre de résultats d'une regex dépend uniquement du nombre de parenthèses capturantes dans le motif, pas de la taille de la chaîne.
    Il faut changer le motif et itérer tous les résultats possibles, ou tout simplement faire une tokenization sur ;.
    Je suis plutôt utilisateur de boost.spirit, mais le problème énoncé était l'un des arguments pour mon changement d'orientation.

    Tu dis qu'il faut faire quelque chose de ce style ? (pour reprendre le problème du posteur original en restant dans boost.regex)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    std::stringstream regexstr( "(\\d+)" );
    int i = 0;
    while( regex.match( regexstr.str() ) )
    {
       ++i;
       regexstr << "[;](\\d+)";
    }
     
    for( int j = 0; j < i; ++j )
    {
       numbers.push_back( matched[j] );
    }
    (c'est brouillon mais c'est pour donner l'idée)

    Parce que bon, sur des petites séquences ça va, mais faire ça si la séquence est très longue, voilà kwa

    (bien que je sois d'accord pour la tokenization, doit bien y avoir un meilleur moyen avec boost.regex non ?)

  5. #5
    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
    Non, utiliser simplement "(\\d+)" avec regex_iterator ou ";" avec regex_token_iterator.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Par défaut
    Bonjour

    En fait je suis parti dans la mauvaise direction.
    j'ai cru, à cause des sous strings qu'elles renvoient, que la fonction match, en plus de reconnaitre une expression régulière pouvait parser une exp, en fonction des parenthèses. Or ça semble pas possible à faire, j'ai essayé de bidouiller une solution avec boost::match_extra, (ici pour voir ce que ça permet de faire). Mais ça devient un vrai casse tête de savoir quelle sous string de boost::smatch.capture correspond à quelle partie de notre regexp dès qu'on a plus de 5 pairs de parenthèses.

    En solution, j ai seulement utilisé boost.regex, pour reconnaitre mon expression régulière, et je me suis fait un parser pour pouvoir la lire.
    Je jetterai un œil sur les regex_token_iterator, et aussi sur boost.spirit dès que j'en aurai le temps.

    merci de votre aide

  7. #7
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Le plus simple restant comme l'a dit loufoque au début de faire une tokenization. (boost.tokenizer ou a la mano)

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

Discussions similaires

  1. BOOST :: REGEX PATTERN IMPOSSIBLE ?
    Par Jah77 dans le forum Boost
    Réponses: 2
    Dernier message: 26/01/2009, 14h50
  2. BOOST :: REGEX INSERTION
    Par Jah77 dans le forum Boost
    Réponses: 2
    Dernier message: 20/01/2009, 10h25
  3. [boost] Regex search : trouver l'index
    Par Choupi dans le forum Boost
    Réponses: 4
    Dernier message: 03/12/2007, 11h17
  4. Configurer boost / regex.
    Par OrthoMaker dans le forum Boost
    Réponses: 11
    Dernier message: 06/08/2007, 09h34

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