|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : vilfred 2:5020/400 02 Dec 2002 16:19:29 To : Kostya Altuhov Subject : Re: Проблемы с логикой регулярных выражений -------------------------------------------------------------------------------- KA> v> но вот почему не работает print "$1 $2 $3\n" KA> if KA> v> $t=~m/(abra\d+).*?myexp/ для меня загадка... KA> Потому что регексы/строки обрабатываются слева KA> направо. Смотрим на строку, ищем KA> первое совпадение с (abra\d+). Hаходим abra1. KA> Обрабатываем .*?: начинаем с 0 между .* и .*? большая разница, т.е. оно не обрабатывает минимизацию слева направо, т.е. не поджимает слева, а только ест справа... баг или фича? KA> символов, сравнимаем остаток строки с myexp, KA> делаем бэктрекинг и увеличиваем KA> длину подстроки .*?, пока не будет совпадения. KA> Совпадение будет, когда .*? KA> станет матчить " jwfhui abra2 hiwf ". Hа этом KA> первом совпадении разбор строки KA> заканчивается. KA> Если в начало регекса добавить .*, все меняется. KA> Теперь .* съедает всю строку, ну это то понятно... KA> и происходит бэктрекинг, пока (abra\d+) не KA> заматчит (abra3). Далее происходит KA> попытка заматчить .*?myexp, это не получается, KA> поэтому делается повторный KA> бэктрекинг, пока (abra\d+) не заматчит (abra2). KA> Теперь .*?myexp матчится при KA> .*? => " hiwf ", и на этом первом совпадении KA> разбор строки заканчивается. KA> Kostya -- TEAM [Маньяки] Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5 * Origin: Talk.ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.perl/648837592c11.html, оценка из 5, голосов 10
|