|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : vilfred 2:5020/400 29 Aug 2001 13:49:35 To : All Subject : не понял как работает regex :( -------------------------------------------------------------------------------- Великомудрый Алл!! Есть пример из кукбука "найти совпадение": $u='network'; $m='workshop'; print "перекрытие $2 найдено: $1$2$3\n" if("$u $m" =~/^(\w+)(\w+) \2 (\w+)$/); (\w+) жрет все слово network. Далее остается еще один (\w+), далее идет пробел, т.к. вся строка "network workshop". Hачинается соответствие с третьей (\w+), у которой первая буква w. Регех видит, что-то не так, и начинает поиск с начала: (\w+) жрет слово networ, отдавая 1 букву второму квантификатору (\w+), \1 содержит networ, \2 содержит k. Далее идет пробел, вся строчка для квантификатора принимает вид: network kworkshop (длинна строчки увеличивается на единицу) Опять несоответствие, возвращаемся назад и содержимое переменной \2 по индукции есть rk. Вся строчка принимает вид network rkworkshop(длинна возросла на 2 от прежней исходной). Hо с самим workshop ниче вообще не происходит, происходит только прирастание спереди к слову workshop слова work(с задних букв), это, имхо, и есть смысл бакреференса(просмотра с возвратом). Хотя вроде бы логично регексп выглядит: (\w+)(\w+) \2(\w+) Если по другому, то получается, что отъедается соответствующая буква из третьей скобки \2(\w+), дебаг которой выглядит так: \2 содержит k => \2(\w+) содержит korkshop \2 содержит rk => \2(\w+) содержит rkrkshop \2 содержит ork => \2(\w+) содержит orkkshop \2 содержит work => \2(\w+) содержит workshop (и тут происходит полное совпадение, регексп работает). Hо не понятно, что происходит с переменной \3(которая содержимое третьей скобки (\w+)). Ведь переменная \3 уменьшается спереди(?), а переменная \2 вызывает уменьшение \1 сзади вследствии возврата с просмотром(бакреференса). Итого по последнему предположению имеем: При поиске перекрестного совпадения в регекспе /^(\w+)(\w+) \2(\w+)$/ происходит следующее(\1 - первая скобка (\w+), \2 вторая скобка (\w+), \3 третья скобка (\w+), перед котрой стоит \2 в исходном regex): \1 ->'network' \2 ->'' => \3->'workshop' # failed \1 ->'networ' \2 ->'k' => \3->'korkshop' # failed \1 ->'netwo' \2 ->'rk' => \3->'rkrkshop' # failed \1 ->'netw' \2 ->'ork' => \3->'orkkshop' # failed \1 ->'net' \2 ->'work' => \3->'workshop' # ok т.е. там происходит одновременное подъедание переменной \3 (ведь не указан в регекспе конец строки $)... получается тогда еще одни непонятный механизм, который выедает слово workshop спереди, так же, как выедается в переменную \2 слово network. Hо принцип неясен, почему network едим сзади по букве, а workshop едим спереди по букве. Или же оно работает так исключительно из-за того, что не стоит конец строки $ Тогда выходит работа регекспа происходит так: \1 ->'network' \2 ->'' => \3->'work' = failed \1 ->'networ' \2 ->'k' => \3->'kork' = failed \1 ->'netwo' \2 ->'rk' => \3->'rkrk' = failed \1 ->'netw' \2 ->'ork' => \3->'orkk' = failed \1 ->'net' \2 ->'work' => \3->'work' = ok но ведь третьим то стоит ЖАДHЫЙ квантификатор (\w+), который должен, просто обязан сожрать все слово workshop. Он же ведь жадный. или регексп работает так: \1 ->'network' \2 ->'' => \3->'workshop' = failed \1 ->'networ' \2 ->'k' => \3->'kworksho' = failed \1 ->'netwo' \2 ->'rk' => \3->'rkworksh' = failed \1 ->'netw' \2 ->'ork' => \3->'orkworks' = failed \1 ->'net' \2 ->'work' => \3->'workwork' = ok или всетки как описал, подъедание \3 спереди, причем только первых четырех символов: \1 ->'network' \2 ->'' => \3->'workshop' # failed \1 ->'networ' \2 ->'k' => \3->'korkshop' # failed \1 ->'netwo' \2 ->'rk' => \3->'rkrkshop' # failed \1 ->'netw' \2 ->'ork' => \3->'orkkshop' # failed \1 ->'net' \2 ->'work' => \3->'workshop' # ok Вобщем непонятно короче как оно все работает... :( Разъяснитье пожалуйста! Спасибо! -- TEAM [Маньяки] Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/648866ffe5ea.html, оценка из 5, голосов 10
|