Ruby lookbehind断言(1.9 / 2.0)有错误吗?

为什么不正则expression式(?<=fo).*匹配foo (而(?<=f).* )?

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

这似乎只发生在单线模式打开(点匹配换行); 没有它,一切都OK:

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

testingRuby 1.9.3和2.0.0。

在Rubular上看到它

编辑:更多观察:

添加一个行尾锚点不会改变任何东西:

 "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,}被破坏(在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 

这已经被正式分类为一个bug,随后被修复 ,再加上另一个涉及多行string的\Z锚问题。

Interesting Posts