Ruby lookbehind断言(1.9/2.0)中是否存在错误?

Tim*_*ker 34 ruby regex lookbehind

为什么正则表达式不(?<=fo).*匹配foo(反之(?<=f).*)?

"foo" =~ /(?<=f).*/m          => 1
"foo" =~ /(?<=fo).*/m         => nil
Run Code Online (Sandbox Code Playgroud)

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

"foo" =~ /(?<=f).*/           => 1
"foo" =~ /(?<=fo).*/          => 2
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.9.3和2.0.0上测试过.

在Rubular上看到它

编辑:更多观察:

添加行尾锚点不会改变任何内容:

"foo" =~ /(?<=fo).*$/m        => nil
Run Code Online (Sandbox Code Playgroud)

但与懒惰的量词一起,它"有效":

"foo" =~ /(?<=fo).*?$/m       => 2
Run Code Online (Sandbox Code Playgroud)

编辑:还有一些观察:

.+与它的等价物一样工作{1,},但仅限于Ruby 1.9(在这种情况下,这似乎是两者之间唯一的行为差异):

"foo" =~ /(?<=fo).+/m         => 2
"foo" =~ /(?<=fo).{1,}/       => 2
Run Code Online (Sandbox Code Playgroud)

在Ruby 2.0中:

"foo" =~ /(?<=fo).+/m         => nil
"foo" =~ /(?<=fo).{1,}/m      => nil
Run Code Online (Sandbox Code Playgroud)

.{0,} 被破坏(1.9和2.0):

"foo" =~ /(?<=fo).{0,}/m      => nil
Run Code Online (Sandbox Code Playgroud)

{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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 7

这已被正式归类为错误并随后修复,以及与\Z多行字符串中的锚点有关的另一个问题.