/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
embedded regex
Fra : Ukendt


Dato : 15-07-08 23:07


Hej,

Er der nogen der har prøvet at bruge et regex lib i et memory udfordet miljø
?
(I omegnen af 128k flash og 8k ram , i alt)
Hvad taler vi om i flash- og ramforbrug?

Ram forbrug afhænger selvfølgelig af hvor vild en expression man laver, men
eksempelvis at matche noget i stil med
"(START)(.*)(STOP)" , hvor gruppe 1 så indeholder alt mellem START og STOP
(bare et eksempel)

Jeg ved at boost har en regex implementation. Og Google kan vel også hjælpe,
men findes der andre "søge mekanismer" der ligger lige for (gerne med mindre
memory aftryk) ?
Meningen er jo at jeg kan lave et program, hvor brugeren skal kunne angive
hvilke dele af nogle data, han er interesseret i. Jeg vil helst ikke lave en
ny version af programmet hver der kommer en ny type ind-data, hvor brugeren
er interesseret i nogle bestemte dele af nogle bestemte linier.

tpt


 
 
Mogens Hansen (16-07-2008)
Kommentar
Fra : Mogens Hansen


Dato : 16-07-08 12:15


"Troels Thomsen" <nej tak ...> wrote in message
news:487d1f83$0$15879$edfadb0f@dtext01.news.tele.dk...
>
> Hej,
>
> Er der nogen der har prøvet at bruge et regex lib i et memory udfordet
> miljø ?

Fra (stort set) bogen
Beautiful Code
ISBN 0-596-51004-7
i kapitlet af Brian Kernighan


// match_here: search for rexexp at beginning of text
bool match_here(const char* regexp, const char* text);

// match_start: search for c*regexp at beginning of text
bool match_star(const char c, const char* regexp, const char* text);

// match: search for regexp anywhere in text
bool match(const char* regexp, const char* text)
{
if(regexp[0] == '^') // matches beginning of the input string
return match_here(regexp+1, text);

do{ // must look even if string is empty
if(match_here(regexp, text))
return true;
} while(*text++ != '\0');
return false;
}

bool match_here(const char* regexp, const char* text)
{
if(regexp[0] == '\0')
return true;

if(regexp[1] == '*') // matches zero or more occurrences of previous
character
return match_star(regexp[0], regexp+2, text);

if(regexp[0] == '$' && regexp[1] == '\0') // matches the end of the input
string
return text[0] == '\0';

if( text[0] != '\0' &&
(regexp[0] == '.' /* matches any single char */ ||
regexp[0] == text[0]))
return match_here(regexp+1, text+1);

return false;
}

bool match_star(const char c, const char* regexp, const char* text)
{
do { // a * matches zero or more instances
if(match_here(regexp, text))
return true;
} while(*text != '\0' && (*text++ == c || c == '.'));
return false;
}

int main()
{
match("^.*hello.*world.*$", "my hello world text");
}


Det fylder ikke alverden, men bruger rekursive kald en del.
Mon ikke man kan bygge lidt videre på det ?

--
Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408857
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste