Страница 1 из 1

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

Добавлено: 2011-06-29 22:05:59
reekoff
Привет всем!
Вроде бы простой регэксп... но результат расходится с моими ожиданиями.
Первый вариант (работает как и ожидается):

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

#!/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.
Может я затупил конкретно или не понимаю сути... в общем, не могу разобраться в поведении этого выражения.
Разъясните, что к чему, если не сложно...

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

Добавлено: 2011-07-05 7:58:21
Charlz_Klug_
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". То есть все символы.
Поэтому и выводится вся строка. Моё мнение: регулярное выражение слишком усложнено.