bonjour à tous,
comment traduire en expression reguliere, "recuperer le texte apres une ligne vide ?"
merci de vos réponse.
bonjour à tous,
comment traduire en expression reguliere, "recuperer le texte apres une ligne vide ?"
merci de vos réponse.
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.
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.
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.
Sinon, j'ai ça, sous le coude :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.
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);
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
Une alternative consiste à lire le fichier paragraphe par paragraphe :
Juste une autre façon de faire...
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"; }
N
Merci de vos solutions, je vais essayer de l'adapter a ce mon script ....c'est pas encore gagné mais bon lol
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 :
merci de me dire comment je pourrais faire
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); }![]()
Non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part m/\n\n(.*)/s
lol nickel vic merci à toi, peux tu détailler ton expression si tu le veux bien, détailler chaque terme ? merci d'avance
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à![]()
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
Si tout le contenu du mail y compris les headers sont contenus dans une variable $mail par exemple, il suffit de faireet tu récupères le corps du message dans $1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $mail =~ m/\n\n(.*)/s;
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.
Partager