Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 не понял как работает regex :(   vilfred   29 Aug 2001 13:49:35 
 Re: не понял как работает regex :(   Timur V. Irmatov   29 Aug 2001 14:18:04 
 Re: не понял как работает regex :(   vilfred   29 Aug 2001 14:28:18 
 Re: не понял как работает regex :(   vilfred   29 Aug 2001 14:42:37 
 Re: не понял как работает regex :(   Vladimir Podgorny   29 Aug 2001 14:48:42 
 Re: не понял как работает regex :(   Alexander Babanov   29 Aug 2001 11:05:03 
 Re: не понял как работает regex :(   Timur V. Irmatov   29 Aug 2001 14:52:48 
 Re: не понял как работает regex :(   vilfred   29 Aug 2001 16:10:08 
 гы, право с лево перепутал :)   vilfred   29 Aug 2001 16:10:09 
 Re: гы, право с лево перепутал :)   vilfred   29 Aug 2001 17:07:05 
 Re: не понял как работает regex :(   Konstantin Stupnik   31 Aug 2001 15:24:20 
 Re: не понял как работает regex :(   Alexander Babanov   29 Aug 2001 11:03:40 
Архивное /ru.perl/648866ffe5ea.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional