Hola a todos,
Estoy tratando de parsear un archivo XML con ayuda de las expresiones regulares de Bennu, pero hay muy poca información acerca de la sistaxis que usa en la documentación. Cuando voy al código leo que usan la opcion RE_SYNTAX_POSIX_MINIMAL_EXTENDED, donde puedo leer que metacaracteres puedo usar?
Muchas gracias!
si mal no recuerdo, hace poco intente usarla para parsear algo... y no es buena idea, tiene un limite de 16 ocurrencias que puede encontrar en una busqueda...
debo decir que es poco util.
si, me di cuenta cuando vi el source.
si puedo extraer gupos de captura con los parentesis entonces me sirve, total un motor de tiles en bennu va a soportar hasta 10 layers porque hay 10 scrolls XD
tiles? scrolls de bennu? xml?
suena copado! :D
Quote from: JaViS on November 14, 2012, 01:23:51 PM
si, me di cuenta cuando vi el source.
si puedo extraer gupos de captura con los parentesis entonces me sirve, total un motor de tiles en bennu va a soportar hasta 10 layers porque hay 10 scrolls XD
la cosa es que tenes que armar las regex de forma que nunca te de mas de 16 ocurrencias, luego si queres expandir estas volves a hacer unas nuevas regex... pero lo veo dificil.
Bueno, me rindo, regex no funciona como espero, pruebas que hago fuera de bennu con otros interpretes me retornan resultados que dentro de bennu no. No se que pensar, probé con diferentes encodings del archivo que estoy leyendo, y nada.
me parece que voy a usar las funciones normales. :(
como te dije, no es util para parsear un archivo.
si, pero, lo que quiero decir es que me parece que no estan funcionando como deberían. Mas alla de si me sirven o no para parsear el archivo, creo que hay un bug ahi o algo :P
no son los mismos patterns que las expresiones regulares normales... incluso entre las implementaciones hay diferentes tipos, no es lo mismo la de unix que la de perl o la de grep o la de php...
que busqueda queres hacer?
a nivel informativo, aca tenes una linda comparacion de diferentes regex
http://www.regular-expressions.info/refflavors.html
decime que queres hacer con bennug, y quizas te pueda ayudar.
tengo entendido que es POSIX básico (como mucho extendido) y lo que quiero es extraer un tag como el siguiente ( independientemente de los atributos que tenga o no)
expresion: <tileset[^<]+
cadena: <tileset firstgid="1" name="Image-Tileset" tilewidth="64" tileheight="64" margin="1">
probé con diferentes expresiones, como:
<tileset[a-z0-9 ="]+
<tileset.+>
pero nada :P
Bueno, segun el link, entonces es POSIX extendido
oh, si, sirve para parsear...
aca te pongo un ejemplo
import "mod_say";
import "mod_regex";
import "mod_string";
private
string s, s1;
string p;
int i, n, t;
begin
s = "hello world" +
"<tileset firstgid="+chr(34)+"1"+chr(34)+" name="+chr(34)+"Image-Tileset"+chr(34)+" tilewidth="+chr(34)+"64"+chr(34)+" tileheight="+chr(34)+"64"+chr(34)+" margin="+chr(34)+"1"+chr(34)+">"
+"end world";
say("input: "+s);
say("searching tileset tag..." );
n = regex( "<tileset.*>", s );
if ( n != -1 )
s = regex_reg[0];
p="\w*="+chr(34)+"\w*"+chr(34);
s1 = s;
t = 0;
while( ( n = regex( p, s1 ) ) != -1 )
say( " attribute: "+regex_reg[0]);
t = n+strlen(regex_reg[0]);
s1 = substr(s1,t);
end
end
end
Entonces si funcionan y el problema esta relacionado con los strings cargados desde ficheros. Ahi te paso el ejemplo modificado:
import "mod_say";
import "mod_regex";
import "mod_string";
import "mod_file";
private
string s, s1;
string p;
int i, n, t;
begin
s = file("maps/test.tmx");
say("searching tileset tag..." );
n = regex( "<tileset.*>", s );
if ( n != -1 )
s = regex_reg[0];
p="\w*="+chr(34)+"\w*"+chr(34);
s1 = s;
t = 0;
while( ( n = regex( p, s1 ) ) != -1 )
say( " attribute: "+regex_reg[0]);
t = n+strlen(regex_reg[0]);
s1 = substr(s1,t);
end
end
end
a mi me funciona bien...
splinter@splinter:~/tmp> bgdi regex
searching tileset tag...
attribute: firstgid="1"
attribute: tilewidth="64"
attribute: tileheight="64"
attribute: margin="1"
attribute: width="1217"
attribute: height="385"
attribute: name="back"
attribute: width="100"
attribute: height="100"
attribute: name="scroll_ratio"
attribute: encoding="csv"
attribute: width="100"
attribute: height="100"
attribute: encoding="csv"
attribute: name="Dureza"
attribute: width="100"
attribute: height="100"
attribute: encoding="csv"
lo que pasa es que corta en el ultimo > y no en el primero
A mi en windows me explota. se sale de bennu con error.
El error dice algo de Assert fail o algo asi
aunque imagino que es... pega el mensaje exacto...
estas con la ultima version, cierto?
Ahora estoy en el laburo (no tengo win aca), pero apenas llegue a casa te pego el mensaje de error.
Uso la version que viene con el ultimo Bennupack.
para los bugs, intenta usar la ultima oficial... porque de esa puedo dar soporte... las que pasaron, pasaron...
Ok, la que tengo que usar es esta, no?
http://www.bennugd.org/downloads/bgd-1.0.0-r300-win32.exe
llego a casa, la bajo, pruebo, y si da error, te lo paso por aca.
si, esa misma.
Bueno, en el archivo de ejemplo las cosas funcionan barbaro, pero cuando lo quiero hacer en mi proyecto tira error:
Quote
libraries/tiledmap/source/api.inc:11 regex( "<tileset.*>", tmx );
Assertion failed!
Program: c:\devBennu\bin\bgdi.exe
File: strings.c, Line 468
Expression: str
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Press any key to continue . . .
Asi que mejor te paso el proyecto como lo tengo porque quizas ya hay algo mas que no me estoy dando cuenta, puede ser?
[Edit]
ahora tampoco me anda el archivito de ejemplo. Me tira el mismo error.
lo vere
Quote from: SplinterGU on November 15, 2012, 11:03:09 PM
lo vere
Muchas gracias!
mientras me paso a linux, ya lo probé ahí y funciona como es esperado. :)