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