Forum: Rails-ES RegexpError: Stack overflow in regexp matcher

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (Guest)
on 2008-10-09 20:49
(Received via mailing list)
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:

* http://fernandoguillen.info/ftp/bloque_post_un_sol...
* http://fernandoguillen.info/ftp/bloque_posts_error.txt
* http://fernandoguillen.info/ftp/bloque_posts_sin_error.txt

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 :/

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.
49b6123803e4f327144e991daab62f77?d=identicon&s=25 Daniel Rodriguez Troitiño (Guest)
on 2008-10-09 21:10
(Received via mailing list)
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?
1341b79e5619e40c4d6369db6b8bdd31?d=identicon&s=25 Juan Lupion (pantulis)
on 2008-10-09 21:44
Fernando Guillen 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/brow...
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (Guest)
on 2008-10-10 00:03
(Received via mailing list)
El día 9 de octubre de 2008 21:44, Juan Lupion
<ruby-forum-incoming@andreas-s.net> escribió:
> ¡Animo que esto le puede pasar al más pintado! [1]!
>
> 1.-
> 
http://groups.google.com/group/comp.lang.ruby/brow...
>

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
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (Guest)
on 2008-10-10 00:05
(Received via mailing list)
El día 9 de octubre de 2008 21:09, Daniel Rodriguez
Troitiño<notzcoolx@yahoo.es>
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.
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (Guest)
on 2008-10-10 00:25
(Received via mailing list)
El día 10 de octubre de 2008 0:04, Fernando Guillen
<fguillen.mail@gmail.com>
escribió:> El día 9 de octubre de 2008 21:09, Daniel Rodriguez Troitiño
> <notzcoolx@yahoo.es> 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 :)

f.
This topic is locked and can not be replied to.