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
锚问题。