Einzelnen Beitrag anzeigen

frieder2008

Registriert seit: 28. Feb 2009
78 Beiträge
 
#1

ExtractStrings ohne Ausnahmen in ""

  Alt 8. Mär 2009, 12:31
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:
  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;
Kann mir jemand einen Hinweis geben?
  Mit Zitat antworten Zitat