Article View: de.comp.lang.c++
Article #157Re: strstr() mit Pattern Matching
From: plugge
Date: Tue, 17 Oct 1995 06:24
Date: Tue, 17 Oct 1995 06:24
73 lines
2997 bytes
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!pluggeReferences:
<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