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