Dlaczego regex (?<=fo).*
nie pasuje do foo
(podczas gdy (?<=f).*
)?Czy jest jakiś błąd w twierdzeniach typu lookback (1.9/2.0)?
"foo" =~ /(?<=f).*/m => 1
"foo" =~ /(?<=fo).*/m => nil
To tylko wydaje się stało z trybu SingleLine włączony (kropka odpowiada nowej linii); bez niego wszystko jest OK:
"foo" =~ /(?<=f).*/ => 1
"foo" =~ /(?<=fo).*/ => 2
Testowany na Rubim 1.9.3 i 2.0.0.
EDIT: Niektóre dalsze obserwacje:
dodanie end-of-line kotwicę niczego nie zmienia:
"foo" =~ /(?<=fo).*$/m => nil
Ale wraz z leniwym kwantyfikatorem, to "działa":
"foo" =~ /(?<=fo).*?$/m => 2
EDIT: I jeszcze kilka uwag:
.+
działa podobnie jak jego odpowiednik {1,}
, ale tylko w Ruby 1.9 (wydaje się, że jest to jedyny behawioralnej różnica między nimi w tym scenariuszu):
"foo" =~ /(?<=fo).+/m => 2
"foo" =~ /(?<=fo).{1,}/ => 2
w Ruby 2.0:
"foo" =~ /(?<=fo).+/m => nil
"foo" =~ /(?<=fo).{1,}/m => nil
.{0,}
jest złapany (zarówno 1,9 do 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
Cóż, twierdzenia lookbehind * są * nową funkcją od wersji 1.9, ale to nie jest tak bardzo skomplikowane ... sprawia, że zastanawiacie się, jakie są inne błędy. –
Jeśli to błąd, to w dwóch różnych silnikach regexp (1.9 i 2.0.0 nie używają tego samego silnika). –
Cóż, silnik Ruby 2.0 to Onigmo, który jest widelcem silnika Oniguruma silnika 1.9. Więc jeśli to naprawdę błąd, może on istnieć w obu silnikach niezauważony do tej pory. –