Почему 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.
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