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.
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