ruby - pwc - ejemplo de aseveraciones
¿Hay algún error en las aserciones de Ruby lookbehind(1.9/2.0)? (1)
¿Por qué la expresión regular (?<=fo).*
coincide con foo
(mientras que (?<=f).*
hace)?
"foo" =~ /(?<=f).*/m => 1
"foo" =~ /(?<=fo).*/m => nil
Esto solo parece suceder con el modo de línea única activado (el punto coincide con la línea nueva); sin eso, todo está bien:
"foo" =~ /(?<=f).*/ => 1
"foo" =~ /(?<=fo).*/ => 2
Probado en Ruby 1.9.3 y 2.0.0.
EDITAR: Algunas observaciones más:
Agregar un ancla de fin de línea no cambia nada:
"foo" =~ /(?<=fo).*$/m => nil
Pero junto con un cuantificador perezoso, "funciona":
"foo" =~ /(?<=fo).*?$/m => 2
EDITAR: Y algunas observaciones más:
.+
funciona igual que su equivalente {1,}
, pero solo en Ruby 1.9 (parece que esa es la única diferencia de comportamiento entre los dos en este escenario):
"foo" =~ /(?<=fo).+/m => 2
"foo" =~ /(?<=fo).{1,}/ => 2
En Ruby 2.0:
"foo" =~ /(?<=fo).+/m => nil
"foo" =~ /(?<=fo).{1,}/m => nil
.{0,}
está reventado (tanto en 1.9 como 2.0):
"foo" =~ /(?<=fo).{0,}/m => nil
Pero {n,m}
funciona en ambos:
"foo" =~ /(?<=fo).{0,1}/m => 2
"foo" =~ /(?<=fo).{0,2}/m => 2
"foo" =~ /(?<=fo).{0,999}/m => 2
"foo" =~ /(?<=fo).{1,999}/m => 2
Esto se ha clasificado oficialmente bugs.ruby-lang.org/issues/8023 , junto con otro problema relacionado con los anclajes /Z
en cadenas multilínea.