2010-08-13 8 views
18
### 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?Problema con los cuantificadores y el aspecto detrás

Respuesta

24

El problema es que Ruby no es compatible con look-behind de longitud variable. Los cuantificadores no son per se, pero no pueden hacer que la longitud de la mirada detrás sea no determinista.

Perl tiene la misma restricción, al igual que casi todos los lenguajes principales que contienen expresiones regulares.

Intente utilizar la coincidencia directa (\w*)\W*?o en lugar del lookbehind.

5

Estaba golpeando mi 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 ser dentro de el lookbehind, pero se puede aplicar en el lookbehind 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 lookbehinds de longitud constante. Parece evitar el problema para mí. :)

Cuestiones relacionadas