Подтвердить что ты не робот

Есть ли ошибка в утверждениях Ruby lookbehind (1.9/2.0)?

Почему regex (?<=fo).* не соответствует foo (тогда как (?<=f).*)?

"foo" =~ /(?<=f).*/m          => 1
"foo" =~ /(?<=fo).*/m         => nil

Это происходит только при включении режима одиночной линии (точка соответствует новой строке); без него все в порядке:

"foo" =~ /(?<=f).*/           => 1
"foo" =~ /(?<=fo).*/          => 2

Протестировано на Ruby 1.9.3 и 2.0.0.

Посмотрите на Rubular

EDIT: Еще несколько замечаний:

Добавление привязки конца строки ничего не меняет:

"foo" =~ /(?<=fo).*$/m        => nil

Но вместе с ленивым квантором он "работает":

"foo" =~ /(?<=fo).*?$/m       => 2

EDIT: И еще несколько замечаний:

.+ работает так же, как и его эквивалент {1,}, но только в Ruby 1.9 (кажется, что единственное поведенческое различие между ними в этом сценарии):

"foo" =~ /(?<=fo).+/m         => 2
"foo" =~ /(?<=fo).{1,}/       => 2

В Ruby 2.0:

"foo" =~ /(?<=fo).+/m         => nil
"foo" =~ /(?<=fo).{1,}/m      => nil

.{0,} разомкнут (в 1.9 и 2.0):

"foo" =~ /(?<=fo).{0,}/m      => nil

Но {n,m} работает в обоих:

"foo" =~ /(?<=fo).{0,1}/m     => 2
"foo" =~ /(?<=fo).{0,2}/m     => 2
"foo" =~ /(?<=fo).{0,999}/m   => 2
"foo" =~ /(?<=fo).{1,999}/m   => 2
4b9b3361

Ответ 1

Это было официально классифицировано как ошибка, а затем исправлено вместе с другой проблемой, связанной с якорями \Z в многострочных строках.