为什么正则表达式不(?<=fo).*
匹配foo
(而匹配(?<=f).*
)?
"foo" =~ /(?<=f).*/m => 1
"foo" =~ /(?<=fo).*/m => nil
这似乎只发生在单行模式打开(点匹配换行符);没有它,一切正常:
"foo" =~ /(?<=f).*/ => 1
"foo" =~ /(?<=fo).*/ => 2
在 Ruby 1.9.3 和 2.0.0 上测试。
编辑:更多观察:
添加行尾锚不会改变任何东西:
"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