|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander P. Russkih 2:468/75 05 Feb 2004 11:51:36 To : All Subject : Re: rfc822 regexp -------------------------------------------------------------------------------- Vladimir Litovka wrote: > ну я в итоге сделал примерно так - только не разбираю по-адресно всю > строку, а выделяю из нее три части - _до_ нужного мне фрагмента, собственно > фрагмент и _после_ него. В первом приближении получилось вот так (смотрится > страшно :-) ), может еще как-то можно оптимизироваться, но я пока не вижу: > > $remove = "toremove user <toremove\@qqq>"; > $header = "Subject: test\nCc: empty\@qqq, toremove\@qqq\nTo: toremove user > <toremove\@qqq>"; > > if ($header =~ s/(^|\n)((?:To):[ \t]+)(.*?)([,\s]*)(?:$remove)([, > \t]*)(.*?)((\n(\w))|$)/$1$9/is) { > > chomp $header; > > if ($4 && $5) { # Between other field's entries > $header .= "\n".$2.$3.', '.$6; > } > elsif ($4) { # Last in field > $header .= "\n".$2.$3.$6; > } > elsif ($5) { # First in field > $header .= "\n".$2.$6; > } > # else - single in field, do nothing > } > > К сожалению, парсить сразу и To, и Cc (т.е. написать (To|Cc)) не > получается, т.е. придется запускать этот regexp дважды. Интересно, он очень > сложный и медленный? :-) не знаю насколько мое решение элегантней, но вот оно, рожденное только что на коленке: === кут хере === #!/usr/bin/perl -w use strict; use English; my $mailheader; while (<DATA>) { $mailheader.= $_; } my $excludeaddr = q!blah1 <blah1@blah>!; print "> $excludeaddr <\n"; my $rfc; foreach $rfc ('To','Cc','Bcc') { # собственно "выкусывание" из заголовка строк To, Cc или Bcc, в зависимости # от итерации цикла foreach $rfc my($addr) = $mailheader =~ m/(?:^|\n)$rfc:\s+([^\n\t]*(\n\t[^\n\t]*)*)/s; # выполняем последующие телодвижения только в случае успешного совпадения if (defined($addr)) { # удаляем ненужные переводы каретки и табуляции $addr =~ s/[\n\t]//gs; # легким движением руки исключаем адрес заданный в $excludeaddr $addr =~ s/$excludeaddr,?//gs; # удаляем запятую в конце строки (если она есть) ($addr) = $addr =~ m/([^,]*(,[^,]*)*?)(\s*,\s*)?$/; # отпечатываем результат (или чего еще там требуется?) print ">> $addr \n"; } } __END__ From: blah-blah To: blah-blah <blah@blah>, blah1 <blah1@blah>, blah2 <blah2@blah>, dabi-dabi <makabuka@aol> Cc: blah3@blah, blah1 <blah1@blah> Subject: rfc822 regexp To: blah-blah <blah@blah> === кут хере === -- XMMS: %s --- Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031007 * Origin: Registered Linux User #341226 (2:468/75@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/1098021c1ffa5.html, оценка из 5, голосов 10
|