Sintaxis Expresiones Regulares de Bennu

Started by JaViS, November 14, 2012, 12:49:32 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

JaViS

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!
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.

gecko

tiles? scrolls de bennu? xml?

suena copado! :D
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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. :(
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

como te dije, no es util para parsear un archivo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

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?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.

JaViS

Bueno, segun el link, entonces es POSIX extendido
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

#12
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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2