ruby - reglas - Problema con los cuantificadores y look-behind
negacion de cuantificadores (2)
### Ruby 1.8.7 ###
require ''rubygems''
require ''oniguruma'' # for look-behind
Oniguruma::ORegexp.new(''h(?=/w*)'')
# => /h(?=/w*)/
Oniguruma::ORegexp.new(''(?<=/w*)o'')
# => ArgumentError: Oniguruma Error: invalid pattern in look-behind
Oniguruma::ORegexp.new(''(?<=/w)o'')
# => /(?<=/w)o/
### Ruby 1.9.2 rc-2 ###
"hello".match(/h(?=/w*)/)
# => #<MatchData "h">
"hello".match(/(?<=/w*)o/)
# => SyntaxError: (irb):3: invalid pattern in look-behind: /(?<=/w*)o/
"hello".match(/(?<=/w)o/)
# => #<MatchData "o">
¿No puedo usar cuantificadores con look-behind?
El problema es que Ruby no es compatible con la apariencia de longitud variable. Los cuantificadores no están fuera per se, pero no pueden hacer que la longitud de la mirada no sea determinista.
Perl tiene la misma restricción, al igual que casi todos los idiomas principales que tienen expresiones regulares.
Intente usar la concordancia directa (/w*)/W*?o
lugar de la mirada atrás.
Me estaba golpeando la cabeza contra el mismo problema, y la respuesta de Borealid ayudó a explicar bien el problema.
Sin embargo, eso me hizo pensar. Tal vez el cuantificador no necesita estar dentro del aspecto detrás, sino que puede aplicarse en el aspecto detrás de sí mismo.
"hello".match(/(?<=/w*)o/)
# => SyntaxError: (irb):3: invalid pattern in look-behind: /(?<=/w*)o/
"hello".match(/(?<=/w)*o/)
# => #<MatchData "o">
Así que ahora tenemos un número variable de miradas de longitud constante. Parece pasar por alto el problema para mí. :)