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

时间:2013-03-05 21:04:37

标签: ruby regex lookbehind

为什么正则表达式(?<=fo).*匹配foo(而(?<=f).*没有)?

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

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

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

在Ruby 1.9.3和2.0.0上测试。

See it on Rubular

编辑:更多观察结果:

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

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

但是与懒惰的量词一起,它可以起作用&#34;:

"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

1 个答案:

答案 0 :(得分:7)

这已被正式归类为as a bug and subsequently fixed,以及有关多行字符串中\Z个锚点的另一个问题。