Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Не понятна работа регэкспа.

16 views
Skip to first unread message

Ilia Gorstkin

unread,
Dec 23, 2011, 1:53:50 AM12/23/11
to
Привет!
Читаю книжецу Фридла. Там выражение. Hе могу вкурить результаты его
работы.

Без ? в конструкции (44\d\d\d) оно захватывает в массив фрагменты из 5-
ти цифр начинающиеся с 44, а заодно, в конце строки из-за смещения
поиска забирает неверный фрагмент 44712. Там написано, что если
добавить ? к (44\d\d\d), то выражение работать не будет. Пытаюсь
разобраться. Оно вроде и работает (находит нужные 2 фрагмента), но
совершенно не понятно определяет их в массив.

$_ = '012342345644567345675678944789123458765447120';
@zips = m/(?:\d\d\d\d\d)*?(44\d\d\d)?/g;
print $zips[3], " and ", $zips[7], " and ", @zips,"\n";

результат: 44567 and 44789 and 4456744789

Получается, что совпадают 2 фрагмента и пишутся в 4-й и 8-й элементы
массива. Hе могу понять, почему именно так происходит.
Я считал, что выражение совпадет сразу в первой позиции (перед нулем),
ибо необязательны обе конструкции ()*? и ()?, и в $zips[0] будет
пустое значение. Затем из-за /g произойдет смена позиции поиска в
строке и выражение совпадет в позиции перед 1 (в $zips[1] пустое
значение). И так далее, пока поиск не дойдет до 44567 которые
совпадут с (44\d\d\d)?. Hо эта подстрока, по-моему, должна была
сохраниться в $zips[10]??? И далее, тем же макаром, 44789 в zips[21] и
44712 в zips[31].
Hа деле же, смещение происходит не так как я думал.
Кто-нибудь может объяснить работу этого выражения?
Спасибо!

0 new messages