|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : vilfred 2:5020/400 29 Aug 2001 14:28:18 To : Timur V. Irmatov Subject : Re: не понял как работает regex :( -------------------------------------------------------------------------------- Привет! TV> Движок (regexp engine) при сопоставлении второй TV> (\w+) видит пробел и TV> возвращется к первой скобке и сопоставляет TV> networ, для второй остается k, TV> матчит пробел, но дальше в строке идет w, а не k. TV> Engine снова возвращается к первой (\w+) ... Этот TV> процесс идет до тех пор, TV> пока для первой скобки не будет сопоставлен net, TV> соответственно для второй - TV> work, третьей - shop... Hе, погоди, а всетки \2(w+) - '' => 'workshop' не подошло, хотя почему, ведь \2 пуст и пуст \2, т.е. должно совпасть и вообще несовпадаемое. Первый шаг по неизвестным причинам дает false, хотя почему не должен давать true... \2(\w+) - 'k' => 'workshop' false потому что \1\2 = 'networ''k' != workshop \2(\w+) - 'rk' => 'workshop' false потому что \1\2 = 'netwo''rk' != workshop \2(\w+) - 'ork' => 'workshop' false потому что \1\2 = 'netw''ork' != workshop \2(\w+) - 'work' => 'workshop' false потому что \1\2 = 'net''work' == workshop - почему? \1\2 = 'net''work' == workworkshop тогда просто совпадает \1\2 = 'net''work' == workshop ведь \3 возможно содержит shop, а \2 стопудово содержит work на четвертом шаге. Т.е. regex'у покласть на то, что происхдит с переменной \3 с ней могет ваабще ниче не происходит, она просто подходит под шаблон \2(\w+) - 'kshop' => 'workshop' false потому что перед 'kshop' идет 'wor' а не пробел. \2(\w+) - 'rkshop' => 'workshop' false потому что перед 'rkshop' идет 'wo' а не пробел. \2(\w+) - 'orkshop' => 'workshop' false потому что перед 'orkshop' идет 'w' а не пробел. \2(\w+) - 'workshop' => 'workshop' true потому что перед 'workshop' идет ' ' - пробел. Regex ведь сравнивает комбинацию переменных \2(\w+) со всей строкой. но глючно он как-то. Вместе с маленьким правилом отката назад одновременно действует большое правило сравнения со всей строкой с целью выискивания из неё конкретной подстроки. и получается $1 = 'net' $2 = 'work' $3 = 'shop' Че-то тут не так... \2 содержит k, а после пробела идет w. Бах несовпаение, \2 отъедает rk, пробел, опять w, млах, опять отъели \2=ork, снова несовпадение, отъели еще, work, совпадение \2(\w+) - 'work''shop' совпадает с подстрокой строки network workshop Итого, $1 -net, $2 - 'work', $3 - 'shop' так вот почему откат происходит, йопересете, потому что нсовпадение. Бардак. Смущает до сих пор другое, ведь третьим-то стоит (\w+) - ЖАДHЫЙ, он обязан сожрать все слово workshop. Хотя он и сожрет, ведь сопоставление идет с сожранным workshop слова work. Как-то через задницу или я еще че- то недогнал. -- Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6488e208e58e.html, оценка из 5, голосов 10
|