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

C++ Discussion :

Expression rationnelle: détecter les commentaires multilignes dans un fichier c++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut Expression rationnelle: détecter les commentaires multilignes dans un fichier c++
    Bonjour,

    Je souhaiterais détecter les commentaires multilignes (/* ... */) contenus dans des fichiers C++: .h, .cpp.

    Pour ce faire, j'utilise boost::regex. J'ai déjà trouvé une expression rationnelle (ou régulière comme vous souhaitez ) qui détecte les commentaires contenus sur une seule ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/\\*([[:punct:]]|[[:alnum:]]|[[:blank:]])*\\*/"
    Mais pas moyen de lui faire reconnaître les multilignes, j'ai bien essayé de remplacer [:blank:] par [:space:], voir même :
    mais le problème c'est qu'il ne s'arrête pas au premier */ mais au dernier.

    Voici l'exemple simple sur lequel je travaille:
    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
    /* Check to see if a file is a PNG file using png_sig_cmp().  png_sig_cmp()
     * returns zero if the image is a PNG and nonzero if it isn't a PNG.
     *
     * The function check_if_png() shown here, but not used, returns nonzero (true)
     * if the file can be opened and is a PNG, 0 (false) otherwise.
     *
     * ...
     */
    #define PNG_BYTES_TO_CHECK 4
    int check_if_png(char *file_name, FILE **fp)
    {
       char buf[PNG_BYTES_TO_CHECK];
     
       /* Open the prospective PNG file. */
       if ((*fp = fopen(file_name, "rb")) == NULL)
          return 0;
     
       /* Read in some of the signature bytes */
       if (fread(buf, 1, PNG_BYTES_TO_CHECK, *fp) != PNG_BYTES_TO_CHECK)
          return 0;
     
       /* Compare the first PNG_BYTES_TO_CHECK bytes of the signature.
          Return nonzero (true) if they match */
     
       return(!png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK));
    }
    Le résultat est donc:
    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
    /* Check to see if a file is a PNG file using png_sig_cmp().  png_sig_cmp()
     * returns zero if the image is a PNG and nonzero if it isn't a PNG.
     *
     * The function check_if_png() shown here, but not used, returns nonzero (true)
     * if the file can be opened and is a PNG, 0 (false) otherwise.
     *
     * ...
     */
    #define PNG_BYTES_TO_CHECK 4
    int check_if_png(char *file_name, FILE **fp)
    {
       char buf[PNG_BYTES_TO_CHECK];
     
       /* Open the prospective PNG file. */
       if ((*fp = fopen(file_name, "rb")) == NULL)
          return 0;
     
       /* Read in some of the signature bytes */
       if (fread(buf, 1, PNG_BYTES_TO_CHECK, *fp) != PNG_BYTES_TO_CHECK)
          return 0;
     
       /* Compare the first PNG_BYTES_TO_CHECK bytes of the signature.
          Return nonzero (true) if they match */
    J'utilise comme option de recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    boost::match_flag_type flags = boost::match_default;
     
       while(boost::regex_search(start, end, what, expression, flags))
    Merci pour votre aide!

  2. #2
    screetch
    Invité(e)
    Par défaut
    le regexp matche la plus grande occurrence de ton expression

    or

    a deux patterns qui "matchent" la regexp :

    et donc il prend la plus longue occurrence!

    je ne sais pas si il y a un moyen de dire a boost de ne pas poursuivre la recherche lorsqu'une serie match le pattern (quel langage barbare desole) mais sinon il faut que tu reconnaisses le pattern qui commence par /*, ne contient pas */ et se termine par */. c'est chiant car */ tient sur deux caracteres, c'est donc plus difficile a reconnaitre

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Essaye par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/\\*(~[\\*])*\\*(~[\\*/](~[\\*])*\\*|\\*)*/"
    Source : The JavaCC FAQ, la note 4.
    J'ai transcrit en regex standard dans une chaîne C viteuf donc c'est peut-être pas exactement ça, en tous cas c'est beaucoup plus compliqué que ce que tu proposes pour obtenir une expression correcte.

    MAT.

  4. #4
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Merci pour le lien
    J'ai essayé et ça ne fonctionne pas
    JAVACC:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/*" (~["*"])* "*" (~["*","/"] (~["*"])* "*" | "*")* "/"
    Si je traduis (je pense que ~ est l'opérateur d'exclusion ^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/\\*(^[*])*\*(^[*/](^[*])*\*|\*)*/"

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Les * dans doivent être échappés par \\ en tous cas.
    Après peut-être que ^\\* suffit et qu'il n'y a pas besoin de ^[\\*], je ne sais plus

    MAT.

  6. #6
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    J'ai trouvé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/\\*([^*]|(\\*+([^*/])))*\\*+/"
    Cette expression prend n'importe quel type de commentaire

    Maintenant le problème, ce sont les commentaires //.
    J'ai encore le même problème quand je fais:
    Ce n'est pas logique comme écriture...

Discussions similaires

  1. Comment sont sélectionnés les commentaires apparaissant dans les actus (hors du forum) ?
    Par goomazio dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 24/01/2013, 21h43
  2. détecter les lignes parallèles dans une image
    Par clynda dans le forum ImageJ
    Réponses: 4
    Dernier message: 17/06/2010, 01h28
  3. Détecter les modifications faites dans une zone de texte avec la souris
    Par nosferapti dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 24/09/2009, 09h48
  4. [Free Pascal] Détecter les lignes identiques dans deux tableaux de texte
    Par jeanmich dans le forum Free Pascal
    Réponses: 11
    Dernier message: 10/01/2009, 15h43
  5. Réponses: 5
    Dernier message: 16/03/2005, 22h17

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