Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#32

Re: Stringvergleich mit Wildcards

  Alt 22. Jun 2009, 19:20
das ist eigentlich zu peinlich zum Erwähnen:
meine Tests hatte ich, da es einfacher zum Debuggen war, meißt direkt mir der Hauptgrundfunktion gemacht und da traten einige Fehler nicht auf ...
z.B. wie der 1-Startindex bei String, welcher nicht als 0-Index für PChar angegeben wurde
und ein Copy&Paste-Fehler, wo Result gleich mit True initialisiert wurde, anstatt mit False

nja, hatte jetzt dabei auch gleich noch eine Idee bekommen, wie der Vergleich vorzeitig abbrechen kann, wenn das letzte Maskenzeichen ein * ist ... bislang wurde dennoch der restliche Stringinhalt geprüft.

und wie schon erwähnt, funktioniert nun auch sowas: suchen folgender Masken in einem String:
wenn Maskenanfang und -ende * lauten, dann wird das dazwischen gesucht und zusammen mit dem neuen cfIgnoreOuterAsterix kann man so auch "recht" speichersparend den einen String nach allen Vorkommen der "Teil"Maske (ohne erstes und letztes * ) durchforsten
Delphi-Quellcode:
Var S, Sr: String;
  i, i2: Integer;
  X: TStringDynArray;

Begin
  S := 'i|F1|V1|F2|i'
    + 'i|F1|V2|F2|i'
    + 'i|F1|V3|F2|i';

  i := 1;
  i2 := -1;
  While True do Begin
    X := MatchStringEx('*F1*F2*', S, [], i, i);
    If X = nil Then Break;
    Sr := X[1];
    Inc(i2);

    ShowMessage('1:'#13#10'Sr[' + IntToStr(i2) + '] = "' + Sr + '"');
  End;



  i := 1;
  i2 := -1;
  While True do Begin
    X := MatchStringEx('*F1*F2*', S, [cfIgnoreOuterAsterix], i, i);
    If X = nil Then Break;
    Sr := X[0];
    Inc(i2);

    ShowMessage('2:'#13#10'Sr[' + IntToStr(i2) + '] = "' + Sr + '"');
  End;



  i := MatchStringCount('*F1*F2*', S, []);

  ShowMessage('3:'#13#10'C = ' + IntToStr(i));



  X := MatchStringAll('*F1*F2*~a~a~a', S, []);
  If X <> nil Then Begin
    Sr := '';
    For i := 0 to Length(X) div 3 - 1 do
      Sr := Sr + 'Sr[' + IntToStr(i) + '] = "' + X[i * 3 + 1] + '"'#13#10
  End Else Sr := 'nichts gefunden';

  ShowMessage('4:'#13#10 + Sr);



  X := MatchStringAll('*V{13}*', S, []);
  If X <> nil Then Begin
    Sr := '';
    For i := 0 to Length(X) div 3 - 1 do
      Sr := Sr + 'Sr[' + IntToStr(i) + '] = "' + X[i * 3 + 1] + '"'#13#10
  End Else Sr := 'nichts gefunden';

  ShowMessage('5:'#13#10 + Sr);


  X := MatchStringAll('*V{13}*', S, [cfIgnoreOuterAsterix]);
  If X <> nil Then Begin
    Sr := '';
    For i := 0 to High(X) do
      Sr := Sr + 'Sr[' + IntToStr(i) + '] = "' + X[i] + '"'#13#10
  End Else Sr := 'nichts gefunden';

  ShowMessage('6:'#13#10 + Sr);
theoretisch müßte auch sowas möglich sein (hab's jetzt nicht geteste)
X := MatchStringAll('*<img *src="*"*', S, [cfNotCaseSensitive, cfIgnoreOuterAsterix]); da müßten nun abwechseln (evt. vorhandene) weitere Parameter und die URL in X drinstehn ... denk ich mal

Download siehe #26
$2B or not $2B
  Mit Zitat antworten Zitat