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_solo_post_error.txt
- 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.