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 :

Soucis avec les regex


Sujet :

Boost C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut Soucis avec les regex
    Bon visiblement je dois êtes boucher aujourd'hui, je n'arrive à rien
    j'ai fait un petit programme pour faire mumuse avec les regex de boost et voici ce que j'ai comme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    main.cpp: In function ‘int main(int, char**)’:
    main.cpp:22: erreur: no matching function for call to ‘regex_match(std::string&, boost::cmatch&, boost::regex&)’
    /usr/include/boost/regex/v4/regex_match.hpp:73: note: candidats sont: bool boost::regex_match(const std::basic_string<charT, ST, SA>&, boost::match_results<typename std::basic_string<charT, ST, SA>::const_iterator, Allocator>&, const boost::basic_regex<charT, traits>&, boost::regex_constants::match_flag_type) [with ST = std::char_traits<char>, SA = std::allocator<char>, Allocator = std::allocator<boost::sub_match<const char*> >, charT = char, traits = boost::regex_traits<char, boost::cpp_regex_traits<char> >]
    make: *** [main.o] Erreur 1
    Voici mon fichier source :
    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
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <boost/regex.hpp>
    using namespace std;
    using namespace boost;
     
    int main(int argc, char *argv[]) {
     
    	//Ouverture du fichier
    	ifstream SOURCE ("source.txt", ios::in);
    	if(!SOURCE)
            {
    		cerr << "Impossible d'ouvrir le fichier en lecture" << endl;
    		exit(1);
    	}
    	string ligne;
    	regex expression("nom=");
    	while(getline(SOURCE, ligne))
            {
    		cout << ligne << endl;
    		cmatch what;
    		if(regex_match(ligne, what, expression))
                    {
    			cout << "Je suis là" << endl;
    		}
    	}
     
    	SOURCE.close();
     
    	(void)argc;
    	(void)argv;
     
    	return 0;
    }
    J'ai trouvé la même erreur ici avec la réponse ici mais même en essayant ça ne fonctionne toujours pas

    [EDIT] Ma page d'inspiration est celle-ci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    c'est smatch qu'il faut utiliser pour les std::string.

    Mais tu n'es pas obligé d'utiliser smatch si tu veux juste vérifier que la regex corresponde.

    Tu peux juste faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( boost::regex_match( ligne, expression ) )
    {
    //...
    }
    ( au fait, ton std::ifstream sera fermé automatiquement quand l'objet est détruit, tu n'es pas obligé d'appeler close() ).
    ( si tu ne veux pas utiliser les arguments de main(), tu peux déclarer juste
    )

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    c'est smatch qu'il faut utiliser pour les std::string.

    Mais tu n'es pas obligé d'utiliser smatch si tu veux juste vérifier que la regex corresponde.

    Tu peux juste faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( boost::regex_match( ligne, expression ) )
    {
    //...
    }
    ( au fait, ton std::ifstream sera fermé automatiquement quand l'objet est détruit, tu n'es pas obligé d'appeler close() ).
    ( si tu ne veux pas utiliser les arguments de main(), tu peux déclarer juste
    )
    En fait c'est un peu plus compliqué. J'aimerai récupérer une partie d'une ligne de caractères avec la regex suivante : /^vers=(.+)$/ (ou une autre, peu importe) et je m'essayais en premier lieu à faire fonctionner une regex pour voir comme exploiter l'affaire ensuite et en approfondissant ma lecture de la doc. Cependant si tu sais comment faire, ... évidemment je suis preneur

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    le code de base ça doit être quelque chose comme ça:

    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
     
    int main()
    {
        boost::smatch what;
        boost::regex expr( "key=(.*)" );
     
        std::string s( "key=value" );
     
        if( boost::regex_match( s, what, expr ) )
        {
            std::cout << what[1] << std::endl;
        }   
     
        return 0;
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    le code de base ça doit être quelque chose comme ça:

    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
     
    int main()
    {
        boost::smatch what;
        boost::regex expr( "key=(.*)" );
     
        std::string s( "key=value" );
     
        if( boost::regex_match( s, what, expr ) )
        {
            std::cout << what[1] << std::endl;
        }   
     
        return 0;
    }
    Salut
    J'ai essayé avec ton exemple et j'avais strictement les mêmes erreurs donc j'en ai déduit que cela ne venait pas d'ici. J'ai cherché pendant des heures et en désespoir de cause je me suis rabattu sur mon Makefile et là ... la délivrance
    Comme un boulet j'ai mis mon -lboost_regex sur la ligne du main.cpp que je transformais en main.o alors qu'il aurait fallu que je le mette ailleurs.
    Du coup ça marche forcément mieux.
    En recherchant mieux dans les logs derrière, j'ai fini par trouver où il m'indiquait que je ne faisais pas le lien au bon moment mais fallait la voir

    Désolé d'avoir encore une fois ennuyé tout le monde et encore merci pour vos aides
    Il me reste plus qu'à trouver comment faire la même chose avec CMake en lieu et place du makefile mais là c'est une autre histoire encore

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

Discussions similaires

  1. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51
  2. Soucis avec les Graphiques dans les états
    Par Chococrocq dans le forum IHM
    Réponses: 27
    Dernier message: 04/01/2006, 19h03
  3. [RegEx] Pb traitement de chaînes avec les regex
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 00h00
  4. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  5. Réponses: 7
    Dernier message: 05/10/2004, 13h44

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