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 Perl Discussion :

Regex pour org-mode [perl6]


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut Regex pour org-mode
    Bonjour,

    Pour un petit programme https://github.com/alainbebe/org-mode-gtk.raku, j'essaye de lire des fichier Org-mode https://orgmode.org/org.html#Document-Structure, et je cale sur la lecture des tags.
    En résumé, un tache peut s'écrire comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    * TODO [#A] ma tache :montag:
    Et j'essaye de checker avec une regex et récupérer le contenu, mais je bloque sur les tags. Voici un code de test
    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
    #!/usr/bin/env raku
    use v6;
     
    my @l;
    push(@l,"* simple titre");
    push(@l,"* TODO simple titre avec todo");
    push(@l,"* TODO [#A] simple titre avec todo et priorité");
    push(@l,"* [#A] simple titre avec priorité");
    push(@l,"* TODO [#A] avec tout :test:suite:");
    push(@l,"* juste un tag :essai:");
    for @l {
        say "original : ",$_;
    #    if $_~~ /^"* " ((["TODO"|"DONE"])" ")? ((\[\#[A|B|C]\])" ")? (.*) / { # ce qui marche mais évidemment ne sépare pas tache et tag
    #    if $_~~ /^"* " ((["TODO"|"DONE"])" ")? ((\[\#[A|B|C]\])" ")? (.*?) (" "(\:.*))? / { # ce qui devrait marcher mais qui ne marche pas du tout
        if $_~~ /^"* " ((["TODO"|"DONE"])" ")? ((\[\#[A|B|C]\])" ")? (.*?) (" "(\:.*)) / { # ce qui marche quand il y a un :tag:, les deux derniers exemples
            print "résultat : * ";
            print $0[0]~" " if $0[0];
            print $1[0]~" " if $1[0];
            print $2;
            print $3 if $3;
            say "";
            say "todo     : "~$0[0]~" " if $0[0];
            say "priority : "~$1[0]~" " if $1[0];
            say "tache    : "~$2;
            say "tag      : "~$3[0] if $3[0];
        } else {
            say "Plus ça rate et plus on a de chances que ça marche..."
        }
        say "";
    }
    Une idée ?

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Tu y étais presque, avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if $_~~ /^"* " ((["TODO"|"DONE"])" ")? ((\[\#[A|B|C]\])" ")? (.*?) (" "(\:.*))? / { # ce qui devrait marcher mais qui ne marche pas du tout
    Seulement voilà, le problème c'est que tu utilises un quantificateur non-greedy .*? et la seul chose qu'il y a après est optionelle (" "(\:.*))?.
    Donc comme le quantificateur est "paresseux", il s'arrête à la première occasion qui réussit qui est pour lui la chaîne vide (et il se fiche bien du reste de la pattern qui est optionelle de toute manière et de la fin de la chaîne).

    Pour remédier à ça, il suffit de terminer la pattern par l'ancre de fin de chaîne $. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if $_~~ /^"* " ((["TODO"|"DONE"])" ")? ((\[\#[A|B|C]\])" ")? (.*?) (" "(\:.*))? $/ {
    Celle-ci aura l'effet en quelque sorte d'une pompe pour .*? qui le forcera à atteindre la fin de la chaîne, mais comme c'est une grosse feignasse, il laissera à (" "(\:.*))? le soin de finir le boulot.

  3. #3
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Super. Je crois pas que j'aurais trouvé tout de suite (bon, j'aurais contourner d'une manière ou d'une autre, style en le faisant en deux fois)

    Merci.

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

Discussions similaires

  1. Utiliser Regex pour remplacement
    Par soveste dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 19/03/2007, 09h48
  2. [Notepad++] utiliser regex pour remplacer des caractères
    Par ilood dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 04/02/2007, 04h06
  3. [RegEx] Regex pour les accents et autres
    Par yule dans le forum Langage
    Réponses: 4
    Dernier message: 21/08/2006, 15h47
  4. [DEBUG.EXE] pour un mode graphique (13h)
    Par powerpsy dans le forum Assembleur
    Réponses: 9
    Dernier message: 19/04/2006, 15h42
  5. Réponses: 7
    Dernier message: 14/01/2006, 18h15

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