34

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

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

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

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

在 Ruby 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
4

1 回答 1

7

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

于 2013-03-08T19:07:53.830 回答