![]() |
Re: String zerlegen
Ich kenne ja die Namen und jeweniger ich mit den Strings hantieren muss, desto besser.
|
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?
|
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.
|
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 |
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? |
Re: String zerlegen
Ok, hier kommt der Code nochmal kommentiert:
Delphi-Quellcode:
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.
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; 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] |
Re: String zerlegen
Besten Dank, jetzt ist alles klar. :thumb:
|
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:
![]() 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 23:28 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-2025 by Thomas Breitkreuz