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