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

Почему не регулярное выражение(?<=fo).* матчfoo (в то время как(?<=f).* делает)?

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

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

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

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

Смотрите это на Рубларе

РЕДАКТИРОВАТЬ: Еще несколько замечаний:

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

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

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

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

РЕДАКТИРОВАТЬ: И еще несколько замечаний:

.+ работает как и его эквивалент{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,} Busted (как в 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

Ответы на вопрос(1)

Ваш ответ на вопрос