Czy istnieje błąd w asercjach dotyczących wyszukiwania Ruby (1.9 / 2.0)?

Dlaczego regex nie jest(?<=fo).* meczfoo (natomiast(?<=f).* robi)?

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

Wydaje się, że dzieje się tak tylko przy włączonym trybie singleline (kropka pasuje do nowej linii); bez niego wszystko jest w porządku:

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

Przetestowano na Ruby 1.9.3 i 2.0.0.

Zobacz na Rubular

EDYTOWAĆ: Jeszcze kilka obserwacji:

Dodanie kotwicy końca linii niczego nie zmienia:

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

Ale wraz z leniwym kwantyfikatorem „działa”:

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

EDYTOWAĆ: I jeszcze kilka obserwacji:

.+ działa tak samo jak jego odpowiednik{1,}, ale tylko w Ruby 1.9 (wydaje się, że to jedyna różnica behawioralna między tymi dwoma scenariuszami):

"foo" =~ /(?<=fo).+/m         => 2
"foo" =~ /(?<=fo).{1,}/       => 2

W Ruby 2.0:

"foo" =~ /(?<=fo).+/m         => nil
"foo" =~ /(?<=fo).{1,}/m      => nil

.{0,} jest obalony (w wersji 1.9 i 2.0):

"foo" =~ /(?<=fo).{0,}/m      => nil

Ale{n,m} działa w obu:

"foo" =~ /(?<=fo).{0,1}/m     => 2
"foo" =~ /(?<=fo).{0,2}/m     => 2
"foo" =~ /(?<=fo).{0,999}/m   => 2
"foo" =~ /(?<=fo).{1,999}/m   => 2

questionAnswers(1)

yourAnswerToTheQuestion