Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > почему срабатывает не так


Автор: burakov 14.10.2011, 10:13
Добрый день

нужно составить регулярное выражение.
Код

use strict;
use warnings;

my $str = 'http://bmw-autocats.ru/parts/E81/3-doors/Europe/116d-N47/2008/november/browse/';
my $pattern = '[^2008]';

if ($str =~ /$pattern/) {
    print 'ok' ."\n";
}


Почему мне пишет "ОК". то есть пропускает данную ссылку, хотя четко указано, что с цифрой 2008
ссылок не пропускать?

Спасибо.

Автор: ginnie 14.10.2011, 11:37
Уважаемый burakov, Ваше регулярное выражение срабатывает для любых символов, кроме 0, 2 и 8. Вам надо $str !~ /2008/

Автор: burakov 14.10.2011, 12:41
Я не могу проверить 
ссылку на !~ 
потому что регулярное выражение -  это шаблон для грабера, который проверяет только 
=~

возможно ли как то составить регулярное выражение так, чтобы 
оно (проверяемое как ) =~ 

фильтровало (убирало, не пропускало) 
урлы, там где есть год (к примеру 2008, 2009)...

Спасибо, за помощь

Автор: alezzz 14.10.2011, 12:52
подобные проблемы уже обсуждались, используйте просмотр вперед:
Код

my $str = 'http://bmw-autocats.ru/parts/E81/3-doors/Europe/116d-N47/2008/november/browse/';
my $pattern = '2008';

print 'ok' if $str =~ /^(?:(?!$pattern).)+$/;


но это вас не спасет если в урл появится 2008 не в том месте где вы его ждете

Автор: Pfailed 14.10.2011, 13:10
Код

/(?:(2008)|($))(*COMMIT)(?(1)(*FAIL))/


Добавлено через 7 минут и 43 секунды
Цитата(alezzz @  14.10.2011,  12:52 Найти цитируемый пост)
но это вас не спасет если в урл появится 2008 не в том месте где вы его ждете

Поясните пожалуйста. По моему ваше выражение сработает для 2008 в любом месте.

Автор: alezzz 14.10.2011, 13:38
Цитата(Pfailed @  14.10.2011,  13:10 Найти цитируемый пост)
Поясните пожалуйста. По моему ваше выражение сработает для 2008 в любом месте.

Я про другое, вдруг появится bmw модели E2008 smile. Более точно нужно было написать $pattern = '\/2008\/', это предостережение что паттерн не точный и на практике может не всегда работать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)