34

(?<=fo).*正規表現が一致しないのはなぜですかfoo(一致(?<=f).*します)?

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

これは、シングルラインモードがオンになっている場合にのみ発生するようです(ドットは改行と一致します)。それがなければ、すべてがOKです:

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

Ruby1.9.3および2.0.0でテスト済み。

Rubularでご覧ください

編集:いくつかのより多くの観察:

行末アンカーを追加しても何も変わりません。

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

しかし、怠惰な数量詞と一緒に、それは「機能します」:

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

編集:そしていくつかのより多くの観察:

.+同等{1,}の機能と同じように機能しますが、Ruby 1.9でのみ機能します(このシナリオでは、2つの動作の違いはこれだけのようです)。

"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 に答える