|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/720920d3249aa.html, оценка из 5, голосов 10
|