Есть ли ошибка в рубиновых утверждениях (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