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

Langage C++ Discussion :

comportement inattendu de Regex


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 165
    Par défaut comportement inattendu de Regex
    Bonjour,


    Je m'essaye à regex en C++ et j'ai un comportement bizarre que je ne m'explique pas.

    Pour le contexte: Je parcours un fichier LaTeX ligne par ligne. Je recherche les lignes ayant le code include afin de capturer ce qui se trouve entre accolade.

    exemple de ligne \include{part/A-initiation} ou encore \include{part/B-autonomie}}]. Notez dans le deuxième cas la double accolade provenant de la fermeture d'une commande initié dans une autre ligne du fichier.

    voici mon code regex pour réaliser cette capture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    regex pattern { R"(\include\{(.*)(\}+))"}
    result = regex_replace("\include{part/A-initiation}", pattern, "$1");
    cout << result << endl;
    result = regex_replace("\include{part/B-autonomie}}", pattern, "$1");
    cout << result << endl;
    qui contre toute attente me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    \part/A-initiation
    \part/B-autonomie}
    Notez le \ en début de chaque ligne et l'accolade en fin de deuxième ligne.

    D’où mes questions:
    1. Pourquoi mes lignes commence par \?
    2. Pourquoi la deuxième accolade n'est pas supprimé? Il me semblait que opérateur + était gourmand.


    J'en mangerais mon chapeau.

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 452
    Par défaut
    Bonjour,

    Pourquoi mes lignes commence par \?
    Parce que le \ est un caractère d'échappement il faut que tu le doubles
    Pourquoi la deuxième accolade n'est pas supprimé? Il me semblait que opérateur + était gourmand.
    Parce que le point décrit tout caractère et que ta ligne doit se terminer après l'accolade donc pour le premier tu lis toute la chaîne sauf l'accolade et pour le second tu lis toute la chaîne sauf la dernière accolade (au moins 1).
    Si tu veux arrêter ta recherche à la première accolade fermante il te faut l'expression (tous les caractères sauf accolade fermante)
    Donc moi j'aurais écrit : si tu veux avoir la fin de la ligne après la dernière accolade fermante ou si la fin de la ligne t’indiffère

    Cordialement

  3. #3
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 165
    Par défaut
    Bonjour,

    Merci de votre réponse. J'ai bien compris mon erreur pour l'accolade fermante.

    Toutefois, pour l'antislash, je ne comprend pas le résultat.

    Je ne comprends pas pourquoi, \ apparaît. En effet, suite à mon erreur, il échappait le i. il me semble qu'il aurait du trouver le pattern à partir de input et donc ne pas afficher \

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 452
    Par défaut
    Bonjour,

    Je ne comprends pas pourquoi, \ apparaît. En effet, suite à mon erreur, il échappait le i. il me semble qu'il aurait du trouver le pattern à partir de input et donc ne pas afficher \
    Selon mes docs, la séquence \i n'a pas de sens. Donc il oublie le \ dans la recherche et affiche celui qui est dans le texte.

    Cordialement

  5. #5
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 165
    Par défaut
    Merci de votre aide

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

Discussions similaires

  1. C# et transaction SQL : Comportement inattendu
    Par StringBuilder dans le forum C#
    Réponses: 1
    Dernier message: 29/12/2011, 11h30
  2. Réponses: 4
    Dernier message: 27/12/2010, 11h27
  3. [XSLT]Problème de comportement inattendu
    Par kalimatchoum dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 06/03/2007, 18h33
  4. [PL/SQL][Oracle9] Proc. Stoc. comportement inattendue
    Par Carlito_superheros dans le forum Oracle
    Réponses: 2
    Dernier message: 30/08/2006, 16h13
  5. Comportement inattendu de Firefox
    Par reggae dans le forum Firefox
    Réponses: 3
    Dernier message: 08/05/2006, 21h15

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