Perl: туплю с регэкспом

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
reekoff
рядовой
Сообщения: 12
Зарегистрирован: 2008-09-23 16:07:42

Perl: туплю с регэкспом

Непрочитанное сообщение reekoff » 2011-06-29 22:05:59

Привет всем!
Вроде бы простой регэксп... но результат расходится с моими ожиданиями.
Первый вариант (работает как и ожидается):

Код: Выделить всё

#!/usr/bin/perl
$_ = 'qwerty';
if ($_ =~ /   (([^e]|t)*)    /x) { print "$1\n" };
Здесь совпадет первая альтернатива в позиции строки до "e" , то бишь, в $1 - qw. До второй дело не доходит.

А здесь затык (t меняю на e):

Код: Выделить всё

#!/usr/bin/perl
$_ = 'qwerty';
if ($_ =~ /   (([^e]|e)*)    /x) { print "$1\n" };
Я ожидаю, что совпадет первая альтернатива в позиции строки до "e", как и в первом случае.
Но совпадает вся строка - в $1 имеем qwerty.
Может я затупил конкретно или не понимаю сути... в общем, не могу разобраться в поведении этого выражения.
Разъясните, что к чему, если не сложно...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Charlz_Klug_
проходил мимо

Re: Perl: туплю с регэкспом

Непрочитанное сообщение Charlz_Klug_ » 2011-07-05 7:58:21

reekoff писал(а): Первый вариант (работает как и ожидается):

Код: Выделить всё

#!/usr/bin/perl
$_ = 'qwerty';
if ($_ =~ /   (([^e]|t)*)    /x) { print "$1\n" };
В моём понимании:

Код: Выделить всё

[^e] - любой символ, кроме "e".

Код: Выделить всё

t - символ "t".

Код: Выделить всё

([^e]|t) - символ должен быть либо не равным "e", либо являться "t".
reekoff писал(а): А здесь затык (t меняю на e):

Код: Выделить всё

#!/usr/bin/perl
$_ = 'qwerty';
if ($_ =~ /   (([^e]|e)*)    /x) { print "$1\n" };

Код: Выделить всё

([^e]|e) - символ должен быть либо не "e", либо "e". То есть все символы.
Поэтому и выводится вся строка. Моё мнение: регулярное выражение слишком усложнено.