RegexpError: Stack overflow in regexp matcher


#1

Hola gente,

Esto una cosa de Ruby y Regex, así que si se sale mucho del tema RoR
pues marcho a la lista de ruby-es a ver… pero como en esta conozco a
más gente pues eso.

El caso es que tengo este error:

RegexpError: Stack overflow in regexp matcher:
/(^ID:(?:(?!-{8}).)*)^-{8}$/m
from (irb):138:in `scan’
from (irb):138
from :0

Me estoy volviendo loco, llevo ya un par de horas intentando
reproducir el error con el fichero más pequeño posible y ya lo he
conseguido.

Al parecer cuando el Match es muy grande (en caracteres) peta el ‘?:’.
Si no ponemos el ?: entonces no peta pero no me separa cada Match y me
los junta todos en el mismo.

Lo que estoy buscando es, de un fichero parecido a un fichero de
exportación de MovableType extraer todos los bloques de texto de los
posts.

Ej.
===== fichero de texto:INI ========
ID: 1
tal
cual

COMMENT
tal

ID: 2
tal
cual

COMMENT
tal

===== fichero de texto:END ========

Me gustaría sacar por un lado:

ID: 1
tal
cual

COMMENT
tal

y por otro:

ID: 2
tal
cual

COMMENT
tal

Para ello uso la expresión regular: dame todos los bloques que
empiezen por ‘ID:’ y acaben en ‘--------’ … pero claro debo decirle
que dentro no haya ningún ‘--------’ por que si no me lo mete todo en
uno…

Entonces hago: /(^ID:(?:(?!-{8}).)*)^-{8}$/m

Y todo bien siempre y cuando ninguno de los matchs sea demasiado
grande (creo que he llegado a la conclusión de que son 3663
caracteres).

Entonces, me gustaría saber si alguien sabe como solucionar esto.

Para reproducir el error podéis descargaros estos ficheros:

Y probar en consola:

$ irb >> string = File.read(“bloque_post_un_solo_post_error.txt”)
$ irb >> string.scan( /(^ID:(?:(?!-{8}).))^-{8}$/m
).flatten.sizeRegexpError: Stack overflow in regexp matcher:
/(^ID:(?:(?!-{8}).)
)^-{8}$/m
from (irb):2:in `scan’
from (irb):2
from :0

Si a este fichero le quitáis un caracter por el medio… si que carga :confused:

Lo mismo con ‘bloque_posts_error.txt’ (pero a este le sobran
más caracteres)

Este si que carga:
$ irb >> string = File.read(“bloque_posts_sin_error.txt”)
$ irb >> string.scan( /(^ID:(?:(?!-{8}).)*)^-{8}$/m ).flatten.size
=> 5

No sé gente… cualquier sugerencia es bienvenida.

Gracias
f.


#2

Sí sabes que cada bloque se termina en 8 guiones y no 6 guiones como
los que hay entre la entrada en sí y los comentarios.

string = File.read(“el_fichero.txt”)
entradas = string.split(/^-{8}$/)

¿No?


#3

Fernando G. wrote:

Esto una cosa de Ruby y Regex, as� que si se sale mucho del tema RoR
pues marcho a la lista de ruby-es a ver… pero como en esta conozco a
m�s gente pues eso.

El caso es que tengo este error:

RegexpError: Stack overflow in regexp matcher:

¡Animo que esto le puede pasar al más pintado! [1]!

1.-
http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/a25e49e2b122f0b4/7fc1df5c798cc5bd?lnk=gst&q=stackoverflow+regexp#7fc1df5c798cc5bd


#4

El día 9 de octubre de 2008 21:44, Juan L.
removed_email_address@domain.invalid escribió:

¡Animo que esto le puede pasar al más pintado! [1]!

1.-
http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/a25e49e2b122f0b4/7fc1df5c798cc5bd?lnk=gst&q=stackoverflow+regexp#7fc1df5c798cc5bd

Anda… mira quien anda por ahí con un problema parecido en el 2004…
seguro que lo arregló pero no suelta prenda.

No se habla en ese hilo de una solución… si?

Gracias
f.


Fernando Guillén
Desarrollador Web Freelance
http://www.fernandoguillen.info


#5

El día 10 de octubre de 2008 0:04, Fernando G.
removed_email_address@domain.invalid
escribió:> El día 9 de octubre de 2008 21:09, Daniel R. Troitiño

removed_email_address@domain.invalid escribió:

Sí sabes que cada bloque se termina en 8 guiones y no 6 guiones como
los que hay entre la entrada en sí y los comentarios.

string = File.read(“el_fichero.txt”)
entradas = string.split(/^-{8}$/)

Eres un monstruo… ahí está, ese pensamiento lateral.

No es exactamente así, pero me has dado la pista.

Al final sí que es exactamente así… porque he hecho que así sea :slight_smile:

f.


#6

El día 9 de octubre de 2008 21:09, Daniel R.
Troitiñoremoved_email_address@domain.invalid
escribió:> Sí sabes que cada bloque se termina en 8 guiones y no 6 guiones como

los que hay entre la entrada en sí y los comentarios.

string = File.read(“el_fichero.txt”)
entradas = string.split(/^-{8}$/)

Eres un monstruo… ahí está, ese pensamiento lateral.

No es exactamente así, pero me has dado la pista.

Mucha gracias
f.