Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String zerlegen (https://www.delphipraxis.net/69170-string-zerlegen.html)

Luckie 11. Mai 2006 10:56

Re: String zerlegen
 
Ich kenne ja die Namen und jeweniger ich mit den Strings hantieren muss, desto besser.

Luckie 14. Mai 2006 13:43

Re: String zerlegen
 
Nun hat sich leider ein problem ergeben: Was wenn in dem String ein Bezeichner vorkommt, den ich nicht kenne und somit nicht im array definieren kann? Ich habe mir jetzt überlegt, dass man da doch irgendwas mit Regulärenausdrücken machen können müsste, da ja alle Bezeichener gleich lang sind, nur Großbuchstabe von A bis Z und die letzten drei zeichen müssen eine Ziffer sein. Icxh wei´ß, dass es da irgendwo eine Delphi Unit gibt, TRegExp oder so. Wäre das damit lösbar? Liefert mir die Unit alles Positionen wo der Ausdruck um String vorkommt?

Luckie 14. Mai 2006 22:28

Re: String zerlegen
 
So, ich habe mir jetzt mal die Unit TRegExpr besorgt. Nur, wie müsste denn der Ausdruck aussehen, der eine Zeichenkette nur aus Großbuchstaben, mit 11 Zeichen Länge findet, wobei die letzten drei Zeichen Ziffern sein müssten? ich habe noch nie was mit Regulärenausdrücken gemacht.

Hawkeye219 14. Mai 2006 22:40

Re: String zerlegen
 
Luckie, was spricht eigentlich gegen die Lösung von onlinekater (Beitrag #20)? Die funktioniert doch zumindest für dein Beispiel bestens, und du benötigst kein Array mit allen Namen.

Gruß Hawkeye

Luckie 14. Mai 2006 22:51

Re: String zerlegen
 
Ups, daran habe ich gar nicht mehr gedacht. :oops: Danke für den Hinweis.

Jetzt weiß ich, warum ich sie nicht benutzt habe: Ich habe die Schleifen nicht verstanden. Könnte mir das noch mal jemand erläutern bitte?

TBx 15. Mai 2006 08:45

Re: String zerlegen
 
Ok, hier kommt der Code nochmal kommentiert:

Delphi-Quellcode:
function DoValueList (ZeiKett:string) : TStringList;
// ****************************************************************************
// Auflösen einer Zeichenkette des Formates "NAME1=WERT1 NAME2=WERT2
//                                           NAME3=WERT3 ......"
// in eine StringList
// ****************************************************************************
// erstellt von Thomas Breitkreuz
// email: [email]tbreitkreuz@breitkreuz-datentechnik.de[/email]
// Codeschnippsel zur Benutzung für Jedermann freigegeben
// ****************************************************************************
var
  s : String;
  i : integer;
begin
  s := ZeiKett;
  Result := TSTringList.Create;
  // ausführen, solange NAME=VALUE - Paare vorhanden sind (diese werden wärend
  // der Bearbeitung laufend aus der Zeichenkette gelöscht
  while pos ('=', s) > 0 do
  begin
    i := Length (s);
    // vom Ende des Strings an solange zurückgehen, bis ein = Zeichen ohne
    // führendes Leerzeichen gefunden wird, es wird davon ausgegangen, daß
    // das = Zeichen dem NAME unmittelbar folgt, dadurch können auch
    // = Zeichen in den Values vorhanden sein, sofern ein Leerzeichen vorgesetzt
    // ist
    while (s[i] <> '=') or (s [i-1] = ' ') do dec (i);
    // nun wird von dem gefundenen = Zeichen aus das nächste Leerzeichen bzw.
    // der Anfang der Zeichenkette gesucht, es wird davon ausgegangen, daß
    // jedem NAME, der nicht am Anfang der Zeichenkette steht, ein Leerzeichen
    // vorausgeht
    while ((i > 0) and (s [i] <> ' ') ) do dec (i);
    // Jetzt wird das gefundene NAME=VALUE-Paar als ersten Eintrag in die
    // Resultliste eingefügt
    Result.Insert(0, Trim(copy (s, i+1, Length (s))));
    // und dann aus der Zeichenkette gelöscht
    delete (s, i +1, Length (s));
    // sollte vor dem ersten NAME=VALUE-Paar noch etwas stehen, so wird dies
    // hier ausgeschnitten und unter dem NAME "$$$TRAILER$$$" in die Resultliste
    // eingefügt
    if (i = 0) and (Length (s) > 0) then
    begin
      Result.Insert(0, '$$$TRAILER$$$=' + Trim (s);
      s := '';
    end;
  end;
end;
Beim Kommentieren ist mir noch eine Unzulänglichkeit aufgefallen: Die Funktion verharrte in einer Endlosschleife, wenn am Anfang der Zeichenkette ein ' =' vor einem "NAME=" vorkam.
Deshalb habe ich noch den Trailer eingeführt.

Ich hoffe, meine Erklärungen sind ausreichend, ansonsten bitte nachfragen.

btw: Hat einer ne Idee, unter welchem Titel man das in die Codelib stellen könnte?

Gruß

Thomas
[Edit] Delphi-Kommentar korrigiert [/Edit]

Luckie 15. Mai 2006 08:57

Re: String zerlegen
 
Besten Dank, jetzt ist alles klar. :thumb:

r2c2 15. Mai 2006 09:18

Re: String zerlegen
 
Das Problem is zwar schon gelöst, aber für all die, dies interessiert, bzw. die, die diesen Thread finden und was Allgemeineres suchen: TDivStrListTDivStrList

In diesem Fall ist aber onlinekaters Version natürlich kürzer und mit weniger Overhead verbunden...

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz