LINUX.ORG.RU

perl, вопрос по регулярному выражению


0

0

% cat test.pl                                                                                  /home/legioner/test
#!/usr/bin/perl

my $str = "_a_b_c_";
while ($str =~ /_(.)_/g) {
        print "$1\n";
}
% ./test.pl                                                                                    /home/legioner/test
a
c
%                                                                                              /home/legioner/test

Почему это происходит, и как сделать, чтобы было "по нормальному"?
В справке написано
g   Match globally, i.e., find all occurrences.

★★★★★

Ответ на: комментарий от friday

Спасибо, работает. Всё-же непонятно, почему не работает моё выражение, точнее непонятно, баг это или фича.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

> точнее непонятно, баг это или фича.

это фича. после нахождения _a_ поиск продолжается с b_c_. и b в твой регекс не вписывается

ananas ★★★★★
()
Ответ на: комментарий от Legioner

Это происходит потому что, первый регэксп уже сожрал _ перед b, и следующий заход уже начинается с b_c_. Применение (?=_) заставляет первый заход закончится на _a не съедая _ перед b.

anonymous
()
Ответ на: комментарий от anonymous

Так, небольшое уточнее. Можно упростить за счет первого _
/_(.)(?=_)/g

anonymous
()

Странно ... я ожидал, что ответом будет a_b_c, как наиболее длинная подстрока, удовлетворяющая регулярному выражению. perl ведь обычно greedy, или я чего-то не понимаю?

anonymous
()
Ответ на: комментарий от anonymous

> Странно ... я ожидал, что ответом будет a_b_c, как наиболее длинная подстрока, удовлетворяющая регулярному выражению. perl ведь обычно greedy, или я чего-то не понимаю?

точка означает ОДИН символ. если бы там стоял квантификатор + или *, тогда другое дело, а одиночному символу пофигу на жадность. точка не может захватить более одного символа

friday ★★★
()
Ответ на: комментарий от friday

> точка означает ОДИН символ

Да, конечно. Торможу.

Спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.