🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #157

Re: strstr() mit Pattern Matching

#157
From: plugge
Date: Tue, 17 Oct 1995 06:24
73 lines
2997 bytes
> ich suche fuer Unix eine C-Function zum Pattern Matching. Die Funktion soll 
> - aehnlich wie strstr() - in einem String nach einem Suchstring suchen. Der
> Suchstring soll dabei aber * (Ersatz fuer mehrere Zeichen) sowie ? (Ersatz fuer
> ein Zeichen) enthalten. Also wie bei Dos oder Unix. Kompliziertere Sachen
> wie a[123]b fuer a1b, a2b oder a3b brauch ich nicht.

Ich habe einmal ein Prograemmchen verbrochen, das gerade das macht, was Du suchst. 
Ich kopiere Dir unten den Quellcode dazu; die Funktion xstrcmp erledigt das strstr
mit pattern matching.

Viele Gruesse
Michel

#include stdio
#include ctype

main(int argc,char *argv[])
{
   char buffer[128],*ptr=buffer;
   int i;
   FILE *datei;

   if(*argv[2]=='-'){
      ptr=argv[2]+1;
      if(_toupper(*ptr)=='H'){
         printf("%s%s%s%s","\nAcronyms: Das Programm sucht aus einer Liste Abkürzungen heraus.\n", 
         "Wildcards sind % für ein Zeichen, * für beliebig viele Zeichen\n",
         "(auch 0). Nach * bzw. % können noch weitere Buchstaben folgen.\n",
         "Gross/Kleinschreibung wird nicht berücksichtigt.\n");
         exit(1);
      }
   }
   if(argc<3)exit(1);
   if((datei=fopen(argv[1],"r"))==NULL){
      printf("Datei %s nicht gefunden; Abbruch",argv[1]);
      exit(4);
   }
   for(i=0;ptr!=NULL;i++){
      ptr=fgets(buffer,127,datei);
      if(xstrcmp(buffer,argv[2]))printf("%s",buffer);
   }
   fclose(datei);
}

int xstrcmp(char *str1,char *str2)
{
   char *ptr1=str1,*ptr2=str2;

   for(;;ptr1++,ptr2++){
      if(*ptr2=='%')continue;
      if(*ptr2=='*'){
         if(*++ptr2=='*'){      /* 2 mal '*' hintereinander */
            ptr1--;     /* Korrektur für ptr1 (nicht erhöhen) */
            continue;
         }
         if(*ptr2=='%')continue;
         if(*ptr2==0||*ptr2==32)return(1);
         if(*ptr1==32 ||*ptr1==8||*ptr1==9||*ptr1==0)return(0);
         while(*ptr1> 0 && *ptr1!=32 && *ptr1!=8 && *ptr1!=9 &&
                _tolower(*ptr1)!=_tolower(*ptr2)){
            ptr1++;
             if(*ptr1==0||*ptr1==32||*ptr1==8||*ptr1==9)return(0);
         }
         if(_tolower(*ptr1)==_tolower(*ptr2))
             continue;  /* weiter testen */
         else
             return(0);
      }
      if((*ptr2==0 &&(*ptr1==32||*ptr1==8||*ptr1==9)))return(1); /* String2 ist in 1 enthalten */
      if(_tolower(*ptr1)!=_tolower(*ptr2))return(0);   /* Ungleichheit */
   } 
}
Technical Details
Message-ID: <1995Oct17.072430.25431@roxi.rz.fht-mannheim.de>
Path: arc1-ca.pugleaf.net!bivb.sr.fht-mannheim.de!plugge
References: <45m53i$oqg@rks1.urz.tu-dresden.de> <45oi0d$lib@mips.pfalz.de>

Show Full Headers
Complete Article Headers
Newsgroups: de.comp.lang.c++,de.comp.lang.c
Path: arc1-ca.pugleaf.net!bivb.sr.fht-mannheim.de!plugge
From: plugge@bivb.sr.fht-mannheim.de ()
Subject: Re: strstr() mit Pattern Matching
References: <45m53i$oqg@rks1.urz.tu-dresden.de> <45oi0d$lib@mips.pfalz.de>
Sender: news@roxi.rz.fht-mannheim.de (NEWS - system account)
Organization: Fachhochschule fuer Technik, Mannheim, Germany
Date: Tue, 17 Oct 95 07:24:30 CET
X-Newsreader: mxrn 6.18-24
Message-ID: <1995Oct17.072430.25431@roxi.rz.fht-mannheim.de>
Reply-To: plugge@biv7.sr.fht-mannheim.de