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上测试过.
编辑:更多观察:
添加行尾锚点不会改变任何内容:
"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)