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 expressions generiques


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Par défaut boost.regex expressions generiques
    Hello tout le monde,

    Comment definir une expression reguliere qui pourra etre appliquee a tous types de string ? L'exemple suivant affiche "Matched" si la chaine passee est "abc" :

    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
    37
    38
    39
     
    #include <string>
    #include <iostream>
    using namespace std;
     
    #include <boost/regex.hpp>
    using namespace boost;
     
     
    template <typename StrT>
    struct my_parser
    {
            bool match( const StrT& ) const;
    };
     
     
    template <typename StrT>
    bool my_parser<StrT>::match( const StrT& a_str ) const
    {
            match_results<typename StrT::const_iterator> m;
            basic_regex<typename StrT::value_type> r( "abc" );
            regex_match( a_str, m, r );
    }
     
     
    int main()
    {
            my_parser<string> p;
            string s = "abc";
     
            //my_parser<wstring> p;
            //wstring s = L"abc";
     
            if ( p.match( s ) )
            {
                    cout << "Matched" << endl;
            }
            return 0;
    };
    Cet exemple fonctionne dans le cas ou le basic_regex est instancie avec une std::string. Cependant, il y a erreur a la compilation lorsqu'on veut utiliser une std::wstring : dans ce cas, la ligne qui definit le basic_regex devrait etre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    basic_regex<typename StrT::value_type> r( L"abc" );
    Notez bien le L devant la chaine "abc" : c'est une wstring.

    J'aimerai rendre ce code generique compatible avec d'autres chaines, comme les QString de Qt par exemple : quelle methode vous semble la plus appropriee ?

    Merci beaucoup !

  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Citation Envoyé par yoloosis Voir le message
    J'aimerai rendre ce code generique compatible avec d'autres chaines, comme les QString de Qt par exemple : quelle methode vous semble la plus appropriee ?
    Il faudra y aller au cas par cas je suppose. Pour les QString par exemple, tu peux fournir une spécialisation de ton template, qui appelle ta fonction match générique après avoir appelé la fonction QString::toStdWString() par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <>
    struct my_parser<QString>
    {
            bool match(const QString &str) const
            {
                    return my_parser<std::wstring>().match(str.toStdWString());
            }
    };
    Je dis peut-être une bêtise, je suis pas un gourou du générique hein

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour ce genre de choses, je n'ai pas trouvé mieux que d'avoir une fonction de conversion de string en string template (nommée string_cast, par exemple), définie une bonne fois pour toute (et qui sert à d'autres choses aussi) avec toutes les surcharges qui vont bien, puis d'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class Dest, class Src>
    Dest string_cast(Src const &src);
     
    basic_regex<typename StrT::value_type> r( string_cast<StrT>(L"abc") );
    Le problème étant qu'on se retrouve à faire au run-time une conversion de chaîne qu'on aurait pu éviter.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Par défaut
    La fonction de conversion... C'est probablement la solution là plus simple à implémenter. D'autres idées ?

Discussions similaires

  1. BOOST::REGEX une expression qui passe pas.
    Par techz dans le forum Boost
    Réponses: 2
    Dernier message: 13/05/2009, 08h14
  2. [Regex]Expression régulière
    Par Guillaume Bénétrix dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 06/12/2005, 00h21
  3. [REGEX]Expression régulière
    Par tomca dans le forum Langage
    Réponses: 2
    Dernier message: 10/10/2005, 11h01
  4. [Regex] Expressions régulières: sous groupe
    Par debdev dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 07/07/2005, 14h10
  5. [RegEx]Expression régulière
    Par Sniper37 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/06/2005, 11h18

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