Автор Тема: Странности регулярного выражения  (Прочитано 4574 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Или просто я что-то очевидное не вижу.
Произвожу посик по файлу, и в нем идут такие вот данные
(здесь привожу 2 строчки из файла)
Цитировать

[01/Jun/2006 15:30:10] Message detected as spam with score: 10.00, threshold 7.00, To: blablablaIV@myserver.ru, Message size: 3159, From: usuiremdxiz@hotmail.com, Subject: раскрутим..Fri, 02 Jun 2006 01:01:12
[30/May/2006 20:00:12] Message detected as spam with score: 9.29, threshold 7.00, To: blablablaAA@myserver.ru, Message size: 5397, From: linda@horafeliz.com, Subject: Срочно перезвони!

Мне нужно выдернуть адрес отправителя (спамера),
я использую такой регэксп:
(привожу кусок скрипта):

open(FILE,"<",$file) || die "can\'t read file $file: $!\\n";
while() {
chomp;
/From:\\s+(.+)\\@(.+)\\.(\\w{0,4})\\,/;
print "$1\\@$2.$3\\n";
}
close(FILE);

и вот что сранно,  строчки файла - почти идентичные, а результат выводимый принтом такой:
для первой строки:
Цитировать

usuiremdxiz@hotmail.com, Subject: раскрутим..Fri

для второй строки:
Цитировать
linda@horafeliz.com


В чем дело? Почему в вывод попадает мусор (файл размером 3,5Mb и в нем мусор проскакивает 5-8 раз...)

Подскажите...
Ворота в perl - perlmonks.org.ru

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Странности регулярного выражения
« Ответ #1 : 14 Июня 2006, 16:10:43 »
очень странно:

  DB<1> $a1 = "[01/Jun/2006 15:30:10] Message detected as spam with score: 10.00, threshold 7.00, To: blablablaIV@myserver.ru, Message size: 3159, From: usuiremdxiz@hotmail.com, Subject: раскрутим..Fri, 02 Jun 2006 01:01:12"

  DB<2> $a2 = "[30/May/2006 20:00:12] Message detected as spam with score: 9.29, threshold 7.00, To: blablablaAA@myserver.ru, Message size: 5397, From: linda@horafeliz.com, Subject: Срочно перезвони!"

  DB<3> if ($a1 =~ m/From:\\s+(.+)\\@(.+)\\.(\\w{0,4})\\,/) { print "$1\\@$2.$3\\n"; }

  DB<4> if ($a2 =~ m/From:\\s+(.+)\\@(.+)\\.(\\w{0,4})\\,/) { print "$1\\@$2.$3\\n"; }

  DB<5>

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Странности регулярного выражения
« Ответ #2 : 14 Июня 2006, 16:15:47 »
DB<11> if ($a1 =~ m|From: ([^,]+),|) { print "$1\\n"; }
usuiremdxiz@hotmail.com
  DB<12> if ($a2 =~ m|From: ([^,]+),|) { print "$1\\n"; }
linda@horafeliz.com
  DB<13>

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Странности регулярного выражения
« Ответ #3 : 14 Июня 2006, 16:28:19 »
Спасибо, с этим отработало на ура.
но по идее ведь мой регэксп тоже должен работать нормально?
Ворота в perl - perlmonks.org.ru

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Странности регулярного выражения
« Ответ #4 : 14 Июня 2006, 16:48:32 »
нет.
perldoc perlre | less -p greedy

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Странности регулярного выражения
« Ответ #5 : 14 Июня 2006, 17:26:26 »
ага, спасибо - все понял...
такой вот вариант решил конкретно эту проблему, но не по всему файлу,
Цитировать

/From:\\s+(.+)\\@(.+?)\\.(\\w+)\\,/;

Ваш вариант наиболее жизнесопсобен.
Ворота в perl - perlmonks.org.ru

Оффлайн xames

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 62
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Странности регулярного выражения
« Ответ #6 : 17 Июня 2006, 01:05:18 »
достаточно уменьшить прожерливость регекспа и все заработает


while( ) {
   chomp;
   /From:\\s+(.+?)\\@(.+?)\\.(\\w{0,4})\\,/;
   print "$1\\@$2.$3\\n";
}

 

Sitemap 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