|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Kostya Altuhov 2:5030/181 29 Nov 2002 10:54:42 To : vilfred Subject : Проблемы с логикой регулярных выражений -------------------------------------------------------------------------------- 29 Nov 02 01:16, to Andrew Sagulin wrote vilfred: AS>> 'fhjd abra1 jwfhui abra2 hiwf myexp jioer abra3' v> print "$1 $2 $3\n" if $t=~m/.*(abra\d+).*?myexp/ v> но вот почему не работает print "$1 $2 $3\n" if v> $t=~m/(abra\d+).*?myexp/ для меня загадка... Потому что регексы/строки обрабатываются слева направо. Смотрим на строку, ищем первое совпадение с (abra\d+). Hаходим abra1. Обрабатываем .*?: начинаем с 0 символов, сравнимаем остаток строки с myexp, делаем бэктрекинг и увеличиваем длину подстроки .*?, пока не будет совпадения. Совпадение будет, когда .*? станет матчить " jwfhui abra2 hiwf ". Hа этом первом совпадении разбор строки заканчивается. Если в начало регекса добавить .*, все меняется. Теперь .* съедает всю строку, и происходит бэктрекинг, пока (abra\d+) не заматчит (abra3). Далее происходит попытка заматчить .*?myexp, это не получается, поэтому делается повторный бэктрекинг, пока (abra\d+) не заматчит (abra2). Теперь .*?myexp матчится при .*? => " hiwf ", и на этом первом совпадении разбор строки заканчивается. Kostya --- * Origin: Never forgive, never forget (2:5030/181) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.perl/133803de73ca8.html, оценка из 5, голосов 10
|