2013-03-05 9 views
34

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.

See it on Rubular

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 
+0

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

+2

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

+4

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

Odpowiedz

Powiązane problemy