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 :

[langage]question expression reguliere


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Fabouney
    Invité(e)
    Par défaut [langage]question expression reguliere
    bonjour à tous,

    comment traduire en expression reguliere, "recuperer le texte apres une ligne vide ?"

    merci de vos réponse.

  2. #2
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 896
    Par défaut
    Salut

    Il y a peut être plus simple :
    tu lis ton fichier ligne par ligne,
    si ligne courante = "" ou "\n", on s'en fout
    sinon, on récupère le texte mettons dans un tableau.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    open FILE,"< toto.txt" or die "$!\n";
    while(<FILE>){
    chomp;
    if($_ eq "" or $_ eq "\n"){}
    else {
    push(@tablo, $_);
    }
    }
    close FILE;
    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  3. #3
    Fabouney
    Invité(e)
    Par défaut
    en fait je récupére pas d'un fichier, je récupére direct le texte brut d'un email, et en fait ce texte et précédé d'une ligne vide.
    donc peut etre que je sotck tout le message ds une variable, je parcour la variable, et apres ? dsl de pas tout siasir du premier coup.

  4. #4
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 896
    Par défaut
    Si on admet que la première ligne est un \n (alias retour chariot) peut être qu'avec un split, cela le fera.
    Peux-tu nous montrer ton script ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  5. #5
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Sinon, j'ai ça, sous le coude :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my $chaine="\n\nToto\nTiti\n\nTata\nTutu\n";
     
    print "$chaine\n";
    print "-----------------------------------------------\n";
     
    my @matches = ( $chaine =~ m/(?:\n|\r)+(.*)(?:\n|\r)+/mg );
     
    print "[$_]\n" foreach (@matches);
    Ca récupère toutes les lignes qui suivent une (ou plusieurs) lignes vides dans la $chaine qui contient la totalité du texte, retours à la ligne compris.

    L'option m permet de travailler en "multi-ligne".

    Le (?:\n|\r)+ permet de chercher un retour à la ligne ou plus, sans les mémoriser (le ?: annule l'effet de mémorisation des parenthèse de regroupement).

    A toi de dériver ...

    Bon courage

  6. #6
    Membre expérimenté
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Par défaut
    Une alternative consiste à lire le fichier paragraphe par paragraphe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /usr/local/bin/perl -w
     
    $/ = "\n\n";
     
    while( <> ) {
        chomp;
        my @arr = split /\n/, $_;
        print "$arr[0]\n";
    }
    Juste une autre façon de faire...

    N

  7. #7
    Fabouney
    Invité(e)
    Par défaut
    Merci de vos solutions, je vais essayer de l'adapter a ce mon script .... c'est pas encore gagné mais bon lol

  8. #8
    Fabouney
    Invité(e)
    Par défaut
    bonjour,

    la solution de 2Eurocents, fnctionne a 50% pour ma part, en effet, je l'ai un peu modifier, car comme le texte que je veux recupérer se trouve après de retour chario (\n\n), je n'ai pas eu de difficulter pour récupérer le début du texte maintenant le problème et pour récupérer la suite, la il s'arrete a la fin de la premiere ligne du message, alors que je voudrait qu'il continu le traitement jusqu'a la fin du message.

    en fait le message que je veux récupérer se situe de la maniere suivante :

    \n\n
    le message
    pouvant etre sur plusieur ligne
    ....


    moi j'avait fait ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub RetourneBody(){
        my $m = shift; #récupère la variable $mess passée en paramètre.
        my $chaine = join '', @$m;
     
        my @matches = ( $chaine =~ m/(?:\n\n)+(.*)(?:\n)+/mg );
        print "$_" foreach (@matches);
    }
    merci de me dire comment je pourrais faire

  9. #9
    vic
    vic est déconnecté
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431

  10. #10
    Fabouney
    Invité(e)
    Par défaut
    lol nickel vic merci à toi, peux tu détailler ton expression si tu le veux bien, détailler chaque terme ? merci d'avance

  11. #11
    vic
    vic est déconnecté
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Par défaut
    Eh bien c'est simple :

    * m// indique qu'on veut effectuer un match
    * le s a la fin indique qu'on veut traiter la variable comme une chaine unique, sans découper au niveau des \n
    * \n\n recherche deux retours chariot consécutifs, marque du début du corps du message dans un mail
    * (.*) indique de garder en mémoire dans la variable $1 la chaîne matchée par .*
    * J'utilise également une propriété des regexp perl qui est que le .* va par défaut récupérer la plus grande chaîne possible. grâce a cette propriété on est sur de récupérer tout le message.

    Il ne faut pas confondre les modificateurs m et s, on s'embrouille un peu au début mais ça entre après quelques lectures de man perlre, perlreref et perlrequick

    Voilà

  12. #12
    Fabouney
    Invité(e)
    Par défaut
    d'accord est si je veux conserver, les \n que le mec créer dans le message original, j'ai essayé de retirer le modificateur s, mais ca ne fonctionne pas

  13. #13
    vic
    vic est déconnecté
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Par défaut
    Si tout le contenu du mail y compris les headers sont contenus dans une variable $mail par exemple, il suffit de faire et tu récupères le corps du message dans $1.

  14. #14
    Fabouney
    Invité(e)
    Par défaut
    ok c'est ce que j'ai fait, c'est peut être du fait que ce soit en texte brut alors que les entré dans le corp du message, ne soit pas reproduit a l'affichage, car en html ca passe.

Discussions similaires

  1. [langage] Probleme expression régulière
    Par killuaster dans le forum Langage
    Réponses: 5
    Dernier message: 29/10/2006, 19h21
  2. [langage] Les expressions régulières
    Par BENCHEKROUN dans le forum Langage
    Réponses: 12
    Dernier message: 20/05/2005, 17h22
  3. [langage] erreur expressions régulières
    Par perlaud dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2004, 14h25
  4. [langage] problème expression régulière
    Par chtiboss dans le forum Langage
    Réponses: 6
    Dernier message: 05/01/2004, 16h08
  5. [langage] [debutant] expression reguliere
    Par toto_titi dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2003, 09h45

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