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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/371.32  31 Aug 2001  09:52:41
 To : Vilfred
 Subject : Re: не понял как работает regex :(
 -------------------------------------------------------------------------------- 
 
 v> Привет!
 TV>> Движок (regexp engine) при сопоставлении второй
 TV>> (\w+) видит пробел и
 TV>> возвращется к первой скобке и сопоставляет
 TV>> networ, для второй остается k,
 TV>> матчит пробел, но дальше в строке идет w, а не k.
 TV>> Engine снова возвращается к первой (\w+) ... Этот
 TV>> процесс идет до тех пор,
 TV>> пока для первой скобки не будет сопоставлен net,
 TV>> соответственно для второй -
 TV>> work, третьей - shop...
 
 v> Hе, погоди, а всетки
 
 v> \2(w+) - '' => 'workshop' не подошло, хотя почему, ведь \2 пуст и пуст 
 v> \2, т.е. должно совпасть и вообще несовпадаемое. Первый шаг по 
 v> неизвестным причинам дает false, хотя почему не должен давать true...
 
 \2 не может быть пусто, потому что оно соответствует \w+, то есть по крайней
 мере один символ там быть обязан. Вот если бы вместо второго \w+ было \w*, то
 матчилось бы именно тут, при $1 eq 'network', $2 eq '', $3 eq 'workshop'.
 
 v> \2(\w+) - 'k' => 'workshop' false потому что 
 v> \1\2 = 'networ''k' != workshop
 
 Hет. Потому что 'k' ne 'w'.
 
 v> \1\2 = 'net''work' == workshop - почему?
 
 \2 eq 'work', и 'workshop' =~ /work(\w+)/
 
 v> Regex ведь сравнивает комбинацию переменных \2(\w+) со всей строкой. но 
 v> глючно он как-то. Вместе с маленьким правилом отката назад одновременно 
 v> действует большое правило сравнения со всей строкой с целью выискивания 
 v> из неё конкретной подстроки.
 
 Hе одновременно. Правило "надо найти совпадение" стоит выше, нежели правила
 жадности, отката и т.д.
 
 v> и получается 
 
 v> $1 = 'net'
 v> $2 = 'work'
 v> $3 = 'shop'
 
 v> Че-то тут не так...
 
 v> \2 содержит k, а после пробела идет w. 
 v> Бах несовпаение, \2 отъедает rk, пробел, опять w, млах, опять отъели 
 v> \2=ork, снова несовпадение, отъели еще, work, совпадение
 
 v> \2(\w+) - 'work''shop' совпадает с подстрокой строки network workshop 
 v> Итого, 
 v> $1 -net, 
 v> $2 - 'work', 
 v> $3 - 'shop'
 
 v> так вот почему откат происходит, йопересете, потому что нсовпадение. 
 v> Бардак. 
 
 v> Смущает до сих пор другое, ведь третьим-то стоит (\w+) - ЖАДHЫЙ, он 
 v> обязан сожрать все слово workshop.
 
 Hет, он обязан сожрать все от того места, _где он начался_ (жадность у нас
 бывает только вправо), _но так, чтобы совпадение таки в итоге получилось_. То
 же самое касается и первых двух. Собственно, второй и третий жрут только то,
 что им оставлено первым. А вот первый жрет так, чтобы получилось совпадение,
 для чего и делает четыре отката - один от пробела (когда не совпал второй \w+)
 и три от w, когда не совпадает \2.
 
 -- 
 Artem Chuprina <ran@ran.pp.ru>
 FIDO: 2:5020/371.32
 --- slrn/0.9.7.0 (Linux)
  * Origin: AKA с подствольным плюсомётом (2:5020/371.32)
 
 

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

 Тема:    Автор:    Дата:  
 Re: не понял как работает regex :(   Artem Chuprina   31 Aug 2001 09:52:41 
Архивное /ru.perl/720920d3249aa.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional