String prüfen mit Wildcards

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

String prüfen mit Wildcards

Beitrag von AND51 »

Hallo!

NickTheQuick hat zwar schon mal einen Code hierzu gepostet, aber ich habe auch noch einen, der komplett ohne Pointer auskommt. Möglicherweise kann man noch an der Performanceschraube drehen, aber dafür ist der Code schön verständlich. Wie man die procedure aufruft, steht unten drunter:

Code: Alles auswählen

Procedure.l match(string.s, match.s, wildcard.s="*")
	Protected NewList strings.s(), n.l, pos.l=1
	
	For n=1 To CountString(match, wildcard)+1
		AddElement(strings())
			strings()=StringField(match, n, wildcard)
	Next
	
	n=CountList(strings())
	
	ForEach strings()
		pos=FindString(string, strings(), pos)
		If pos Or (Not strings())
			pos+Len(strings())
			n-1
		EndIf
	Next
	
	ProcedureReturn (Not n)
EndProcedure

#a="Franz jagt im komplett verwahrlosten Taxi quer durch Bayern"
#b="XFranz X im komplett X Taxi quer Xdurch BaXn"

If match(#a, #b, "X")
	Debug "M A T C H !"
EndIf
Damit kann man zum beispiel Dateinamen überprüfen, wie bei der Suche, wenn man nach *.pb sucht, werden alle PB-Dateien gefunden. Eine Suche nach »Code*.pb« wird z. B. mit allen dateinamen/Strings übereinstimmen, bei denen am Anfang Code und am ende .pb steht. man bachte, dass das Wildcard auch für nichts, also für "" stehen kann!

Mit meiner Prozedur lässt sich das Wildcard übrigens auch austauschen.
<)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hat niemand eine Meinung dazu oder mag den Code mal auf seine Tauglichkeit hin testen? :|
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Ich find es Praktisch. Wäre es auch möglich, Variablen hinzuzufügen, die man abfragen kann?

z.b.:

match("a = 342", "[variable:name] = [zuweisung:nummeric]", "", "[", "]")

Ich find den Code auf jeden fall gut.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

ich verstehe leider nicht ganz, was du meinst...? Wieso benutzt du für dein Vorhaben nicht If ?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

War etwas unverständlich:

Ich führe folgenden Befehl aus:

match("a = 342", "[variable:name] = [zuweisung:nummeric]", "", "[", "]")

und jetzt kann ich z.B. mit GetMatchVar(Varname.s) den inhalt von 'zuweisung' oder 'variable' bekommen. Bei match(..) wird der Syntax überprüft und die Variablen in eine abfragbare liste für GetMatchVar(...) eingeschrieben.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Noch ein Kandidat fuer Regexp :D

Code: Alles auswählen

  
  ;- Download http://www.psyon.org/projects/pcre-win32/index.php
  
  Structure regmatch
    so.l
    eo.l
  EndStructure
  
  Structure regex
    *pcre
    nsub.l
    erroffset.l
  EndStructure
  
  #REG_ICASE   =  01
  #REG_NEWLINE =  02
  #REG_NOTBOL  =  04
  #REG_NOTEOL  =  08
  
  ImportC "pcre.lib" : EndImport
  
  ImportC "pcreposix.lib" 
    regcomp(*regex.regex,*pattern,flags)
    regexec(*regex.regex,*string,match_size,*match_array.regmatch,flags)
    regerror(errcode,*regex.regex,*errbuf,errbuf_size)
    regfree(*regex.regex)
  EndImport

  regcomp(@regex.regex,@"([a-z0-9_]+)\s*=\s*([a-z0-9_]+)",0)
  
  Procedure TestLine(*regex.regex,line.s,var,val)
    Dim match.regmatch(*regex\nsub)  
    regexec(*regex,@line,*regex\nsub+1,match(),0) 
    CopyMemory(@line+match(1)\so+pos,var,match(1)\eo-match(1)\so)
    CopyMemory(@line+match(2)\so+pos,val,match(2)\eo-match(2)\so) 
  EndProcedure
  
  
  var.s = Space(20)
  val.s = Space(20)
  
  TestLine(regex,"abc = 45646567575675674646456573473",@var,@val)
  
  Debug var
  Debug val
  
  
  var.s = Space(20)
  val.s = Space(20)
  
  TestLine(regex,"lalalalaalalala = 11233",@var,@val)
  
  Debug var
  Debug val
  
der Ausdruck ist zwar alles andere als perfekt aber als Beispiel langt es .
Antworten