Есть ли ошибка в рубиновых утверждениях (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 ответ
Это было официально классифицировано как ошибка и впоследствии исправлено, вместе с другой проблемой, касающейся \Z
якоря в многострочных строках.