![]() |
ExtractStrings ohne Ausnahmen in ""
Moin,
ich versuche gerade irgendwie, die ExtractStrings-Funktion (D5) so umzubauen, dass sie keine Sonderstellung für Anführungszeichen vergibt. Heißt: Die Funktion nimmt ", ', Lehrzeichen und Zeilenumbruch als Trennungszeichen; Trennzeichen innerhalb zweier Anführungszeichen werden ignoriert. Bsp.: String: Hans sucht Jürgen, und sagt ihm "Du Schweinehund" Dann ergibt die zurückgegebene Liste (Komma auch als Trnnzeichen definiert). Hans sucht Jürgen und sagt ihm Du Schweinehund Ich brauche die Funktion jetzt aber so, dass sie ausnahmslos alle Sonderzeichen (also Nicht-Buchstaben) als Trennzeichen, d.h. Anführungzeichen IMMER als Trennzeichen ohne Sonderregel interpretiert. Ok, ich hoffe, ich konnte mich verständlich machen. Problem jetzt: ich verstehe die VCL-Routine nicht bzw. finde nicht den Abschnitt für diese "Ausnahmeregel".. Funktion aus der VCL:
Delphi-Quellcode:
Kann mir jemand einen Hinweis geben?
function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar;
Strings: TStrings): Integer; var Head, Tail: PChar; EOS, InQuote: Boolean; QuoteChar: Char; Item: string; begin Result := 0; if (Content = nil) or (Content^=#0) or (Strings = nil) then Exit; Tail := Content; InQuote := False; QuoteChar := #0; Strings.BeginUpdate; try repeat while Tail^ in WhiteSpace + [#13, #10] do Inc(Tail); Head := Tail; while True do begin while (InQuote and not (Tail^ in ['''', '"', #0])) or not (Tail^ in Separators + [#0, #13, #10, '''', '"']) do Inc(Tail); if Tail^ in ['''', '"'] then begin if (QuoteChar <> #0) and (QuoteChar = Tail^) then QuoteChar := #0 else QuoteChar := Tail^; InQuote := QuoteChar <> #0; Inc(Tail); end else Break; end; EOS := Tail^ = #0; if (Head <> Tail) and (Head^ <> #0) then begin if Strings <> nil then begin SetString(Item, Head, Tail - Head); Strings.Add(Item); end; Inc(Result); end; Inc(Tail); until EOS; finally Strings.EndUpdate; end; end; |
Re: ExtractStrings ohne Ausnahmen in ""
hast du von deinem D5 die Quellcodes?
da kannst du GetParamStr nutzen ... damit zerlegt ![]() ![]() |
Re: ExtractStrings ohne Ausnahmen in ""
Zitat:
Hm, versteh' ich aber nicht ganz. Sowohl D-Hilfe als auch Parameterlisten kennen bei mir (D5) getparamstr nicht. Und ich sehe auch (noch) nicht, wo paramstr in dem Delphi-Code von extractstrings ist. :gruebel: Woran ich dachte, war, einfach die ExtractStrings-Funktion zu kopieren und entsprechend abzuändern. Gruß & thx a lot |
Re: ExtractStrings ohne Ausnahmen in ""
drum fragte ich ja, ob du die Quellcodes von Delphi hast ... das ist eine interne Funktion.
|
Re: ExtractStrings ohne Ausnahmen in ""
kapia eck immer noch nich :duck:
|
Re: ExtractStrings ohne Ausnahmen in ""
Wenn du die Quellcodes des Delphieigenen Units hast, dann brauchst dir nur mal
ich hatte gar was Kleines fast fertig (bis der PC verreckt ist :wall: ) muß aber nun los ... mach's eventuell heut abend nochmal z.B. die Punktion ParamStr ansehn und gucken was die macht. |
Re: ExtractStrings ohne Ausnahmen in ""
OK, hab grad nochmal nachgesehn ... D7 hat diese Funktion noch nicht, wurde also doch erst später eingeführt :oops:
hier wird erstmal nur das ' ' als Trennzeichen verwendet und wenn ein Teil mit " anfängt, dann bleibt er zusammen...
Delphi-Quellcode:
Function ExplodeEx(Const S: String): TStringDynArray;
Var i, i2: Integer; Begin Result := nil; i := 1; While i <= Length(S) do Begin If S[i] = '"' Then Begin Inc(i); i2 := PosEx('"', S, i); End Else i2 := PosEx(' ', S, i + 1); If i2 = 0 Then i2 := Length(S) + 1; SetLength(Result, Length(Result) + 1); Result[High(Result)] := Copy(S, i, i2 - i); If (i2 < Length(S)) and (S[i2] = '"') and (S[i2 + 1] = ' ') Then Inc(i2); i := i2 + 1; End; End;
Delphi-Quellcode:
x := ExplodeEx('12 "34 56" 7 89');
// Ergebnis: x[0] = '12' x[1] = '34 56' x[2] = '7' x[3] = '89' |
Re: ExtractStrings ohne Ausnahmen in ""
Klasse, danke! Da kann ich ma versuchen, weiterzubauen! :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz