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

SL & STL C++ Discussion :

Expressions Régulières et nom de fichiers


Sujet :

SL & STL C++

  1. #1
    Candidat au Club
    Expressions Régulières et nom de fichiers
    Bonjour à toutes et à tous,
    J'ai une chaine de caractères (char* ou std::string, peu importe) et je veux créer un fichier qui porte comme nom cette chaîne. Hélas je ne connais pas à l'avance son contenu, il me faut donc effectuer une vérification sur la validité du nom de fichier (pas de \ / : * ? " < > |). Je pensais donc utiliser les expressions régulières pour remplacer ces caractères systématiquement à ma chaîne initiale, mais est-ce possible et comment ? (j'ai encore BEAUCOUP de mal avec les expression régulières...)

    Merci d'avance à vous

  2. ###raw>post.musername###
    Expert confirmé
    Citation Envoyé par Worm00 Voir le message
    Bonjour à toutes et à tous,
    J'ai une chaine de caractères (char* ou std::string, peu importe) et je veux créer un fichier qui porte comme nom cette chaîne. Hélas je ne connais pas à l'avance son contenu, il me faut donc effectuer une vérification sur la validité du nom de fichier (pas de \ / : * ? " < > |). Je pensais donc utiliser les expressions régulières pour remplacer ces caractères systématiquement à ma chaîne initiale, mais est-ce possible et comment ? (j'ai encore BEAUCOUP de mal avec les expression régulières...)

    Merci d'avance à vous
    Si tu fais juste un test vrai/faux, tu risques fort de demander régulièrement à l'utilisateur d'entrer plusieurs fois une chaîne avant d'en accepter une correcte. Pour éviter ça, tu peux tout simplement transformer les caractères dont tu ne veux pas en caractère acceptable (par exemple _) - avec std::transform

    Code C++98 :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
    template <class T>
    struct make_valid_filename_helper
    {
      T operator()(const T& in)
      {
        if (in == '*' || in == '?' || in == ':' || in == '\\' || in == '/' || in == '"')
          return '_';
        return in;
      }
    };
    
    ...
    
    std::string make_valid_filename(const std::string& str)
    {
        std::string out(str);
        std::transform(str.begin(), str.end(), out.begin(), 
          make_valid_filename_helper());
    }


    Une version C++11 pourrait se servir d'une expression lambda (je te laisse cet exercice).

    Si tu souhaites utiliser les expressions rationnelles (pas régulières ; regular expression signifie expression rationnelle ; "regular" est dans ce contexte un faux ami), j'ai écrit un billet sur ce sujet il y a un certain temps.
      0  0