Seite 1 von 1

String prüfen mit Wildcards

Verfasst: 04.11.2006 00:00
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.
<)

Verfasst: 05.11.2006 20:15
von AND51
Hat niemand eine Meinung dazu oder mag den Code mal auf seine Tauglichkeit hin testen? :|

Verfasst: 05.11.2006 20:21
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.

Verfasst: 05.11.2006 21:11
von AND51
ich verstehe leider nicht ganz, was du meinst...? Wieso benutzt du für dein Vorhaben nicht If ?

Verfasst: 05.11.2006 22:34
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.

Verfasst: 05.11.2006 23:06
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 .