|
|
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
|