Homepage Jasocul

Stringverarbeitung

Die wichtigsten Funktionen zur Stringverarbeitung sind:

Demo-Source

Demo-EXE

Die Auszüge aus der Delphi-Online-Hilfe durfte ich mit freundlicher Genehmigung der Firma Borland hier veröffenlichen. Die Hilfe-Texte stammen aus Delphi 5.0

Die Funktion Pos: (Bestimmung der Position eines Strings in einem andern)

Die Definition gemäß Delphi-Hilfe

function Pos(Substr: string; S: string): Integer;

Beschreibung:

Pos sucht in dem String S nach dem Teil-String Substr. Die Parameter Substr und S sind String-Ausdrücke.

Wird der Teil-String gefunden, gibt Pos den Integer-Index des ersten Zeichens von Substr in S zurück. Die Groß/Kleinschreibung wird von Pos nicht berücksichtigt. Ist Substr nicht vorhanden, wird der Wert Null zurückgegeben.

Kommentar

ACHTUNG! In dieser Beschreibung ist ein Fehler!
Die Groß/Kleinschreibung wird sehr wohl berücksichtigt. Für die Pos-Funktion ist also ein "a" nicht ein "A"!

Was macht diese Funktion?

Sie überprüft, ob ein String (Parameter Substr) in einem anderen String (Parameter S) enthalten ist und gibt die Anfangs-Position des Such-Strings (Substr) im Prüf-String zurück.
Kommt der Such-String nicht darin vor, wird als Wert die Zahl "0" als Ergebnis geliefert.

Beispiele:

Pos('all', 'Hallo')

Das Ergebnis ist 2.

Pos('All', 'Hallo')

Das Ergebnis ist 0, weil Groß/Kleinschreibung in der Funktion berücksichtigt wird.

Pos('l', 'Hallo')

Das Ergebnis ist 3. Die Position des zweiten 'l' ist so nicht feststellbar.

Die Funktion Copy: (Einen Teil eines vorhandenen String kopieren)

Die Definition gemäß Delphi-Hilfe

function Copy(S; Index, Count: Integer): string;
function Copy(S; Index, Count: Integer): array;

Beschreibung

S ist ein Ausdruck des Typs String oder dynamisches Array. Index und Count sind Integer-Ausdrücke. Copy gibt einen Substring oder ein Array zurück, das Count Zeichen oder Elemente ab S[Index] enthält.

Ist Index größer als die Länge von S, gibt Copy einen leeren String oder ein leeres Array zurück.

Gibt Count mehr Zeichen oder Array-Elemente an, als verfügbar sind, werden nur die Zeichen oder Elemente von S[Index] bis zum Ende von S zurückgegeben.

Kommentar

Auch wenn in der Delphi-Hilfe auf die überlagerte Funktion mit dynamischen Array verwiesen wird, beschränke ich mich hier auf die reine String-Funktion. Außerdem ist die Deklaration der Funktion in der Hilfe unvollständig.
Korrekt wäre es:
function Copy(S: String; Index, Count: Integer): string;
bzw.:
function Copy(S: Array; Index, Count: Integer): string;

Was macht diese Funktion?

Sie kopiert aus einem vorhandenen String einen Teil heraus. Dabei ist der Parameter Index die erste Stelle, ab der kopiert werden soll. Die Zählung fängt bei eins an. Der Parameter Count gibt an, wieviele Zeichen ab der Start-Stelle kopiert werden sollen.
Wenn die Start-Position größer als die Länge des Strings ist, kann zwangsläufig nur ein leerer String das Ergebnis sein.
Wenn Count so groß gewählt wird, dass die Länge des Strings überschritten wird, macht das nichts. Es wird dann einfach bis zum Ende des Strings kopiert.
Wie die Funktion auf negative Werte reagiert, habe ich bisher noch nicht getestet.

Beispiele:

Copy('Hallo', 8, 4)

Das Ergebnis ist eine Leerstring

Copy('Hallo', 2, 3)

Das Ergebnis ist 'all'

Copy('Hallo', 2, 10)

Das Ergebnis ist 'allo'

Die Prozedur Insert: (Einen String in einen anderen einfügen)

Die Definition gemäß Delphi-Hilfe

procedure Insert(Source: string; var S: string; Index: Integer);

Beschreibung

Insert fügt Source in S an der Position S[Index] ein.

Source ist ein String-Ausdruck und S eine String-Variable beliebiger Länge. Der Integer-Ausdruck Index ist ein Zeichen-Index und kein Byte-Index.

Kommentar

Für einen Anfänger ist die Erklärung, meiner Meinung nach, viel zu kompliziert.
Zunächst eine Erklärung vorab. In dieser Prozedur ist ein sogenannter Var-Parameter. Das bedeutet, dass dieser Parameter an die Prozedur übergeben wird und dort verändert werden kann. Dieser Veränderung bekommt man auch zurück. Dies ist bei "normalen" Parametern nicht der Fall. Eventuelle Veränderungen in der Prozedur haben keine Auswirkungen.
Auch hier beginnt die Zählung wieder eins. Das ist in der Delphi-Hilfe mit Zeichen-Index gemeint. Üblicherweise beginnt die Zählung nämlich bei Null (Byte-Index).

Was macht diese Funktion?

Normalerweise werden Strings, wenn man sie verknüpft, irgendwie aneinander gehängt. Gelegentlich kommt es aber vor, dass ein String in den anderen eingefügt werden muss. Oft handelt es sich im einzelne Zeichen, die Strings in Abschnitte unterteilen.
Man gibt einen Source-String an, der in einen Ziel-String eingefügt werden soll. Dazu wird der Prozedur noch mitgeteilt, an welcher Stelle (Index). Das ist eigentlich schon alles. Wie im Kommentar schon erwähnt, beginnt die Zählung bei eins. Der Ziel-String muss immer eine Variable sein. Einen konstanten Text kann man dort nicht einsetzen. Das würde aber auch der Compiler schon bemängeln.

Beispiele:

Gegeben sei eine Variable sTest vom Type String

sTest := 'Hallo Welt';

Insert('ganze', sTest, 7)

sTest ist dann 'Hallo ganzeWelt'. Also noch ein Leerzeichen vergessen.

Insert(' ', sTest, 12)

sTest ist jetzt 'Hallo ganze Welt'

Die Prozedur Delete: (Einen Teil eines vorhandenen Strings löschen)

Die Definition gemäß Delphi-Hilfe

procedure Delete(var S: string; Index, Count:Integer);

Beschreibung

Delete entfernt, beginnend mit S[Index], Count Zeichen aus dem String S. S ist eine String-Variable. Index und Count sind Integer-Ausdrücke.

Ist der Wert von Index größer als die Länge von S, werden keine Zeichen gelöscht. Werden mit Count mehr Zeichen angegeben, als beginnend bei S[Index] im String vorhanden sind, wird der Rest des Strings gelöscht.

Kommentar

Zunächst eine Erklärung vorab. In dieser Prozedur ist ein sogenannter Var-Parameter. Das bedeutet, dass dieser Parameter an die Prozedur übergeben wird und dort verändert werden kann. Dieser Veränderung bekommt man auch zurück. Dies ist bei "normalen" Parametern nicht der Fall. Eventuelle Veränderungen in der Prozedur haben keine Auswirkungen.
Wie es bei String-Funktionen und - Prozeduren üblich ist, beginnt die Zählung des Index bei eins und nicht, wie sonst bei einem Array gewohnt, bei Null.

Was macht diese Funktion?

Gelegentlich müssen Zeichen aus einem String gelöscht werden. Die Prozedur Delete erfüllt diese Aufgabe. Aus einem String werden ab einer angegebenen Stelle (Index) eine bestimmte Anzahl (Count) Zeichen gelöscht.
Wenn die Stelle, ab der gelöscht werden soll nicht innerhalb des Strings liegt, also dahinter, passiert nichts. Der String bleibt unverändert. Und gibt man mehr Zeichen vor, die gelöscht werden sollen, als tatsächlich vorhanden, wird einfach der ganze Rest des Strings gelöscht.

Beispiele:

Gegeben sei eine Variable sTest vom Type String

sTest := 'Hallo ganze Welt';

Delete (sTest, 7, 6)

sTest ist dann 'Hallo Welt'.

Delete (sTest, 6, 5)

sTest ist jetzt 'Hallo'. Hier hätte man jetzt auch statt der 5 jede beliebige größere Zahl einsetzen können. Das Ergebnis wäre unverändert.

Die Funktion Length: (Die Länge eines Strings bestimmen)

Die Definition gemäß Delphi-Hilfe

function Length(S): Integer;

Beschreibung

Length gibt die Anzahl der im angegebenen String vorhandenen Zeichen oder die Anzahl der Elemente im Array zurück.

Bei Einzelbyte- (AnsiString) und Multibyte-Strings gibt Length die Anzahl der Bytes in der Zeichenfolge zurück. Bei Unicode-Strings (WideString) gibt sie die Byte-Anzahl geteilt durch zwei zurück.

S ist ein String oder ein Array.

Kommentar

Bei dieser Erläuterung schüttelt es mich immer wieder. Wie kann man etwas so einfaches so kompliziert und dann auch noch falsch erklären.
Ich beschränke mich hier wieder auf die String-Funktion und vernachlässige die Array-Funktion.
In der Delphi-Hilfe wurden Multibyte und WideString vertauscht. Multibyte-Strings bestehen meines Wissens aus zwei Byte. Dieser werden z.B. zur Darstellung von Schriftzeichen benötigt. WideString ist im Prinzip das gleiche wie AnsiString. Dies werde ich aber nochmal recherchieren.

Was macht diese Funktion?

Das ist nun ganz einfach und steht auch in der Delphi-Hilfe klar und deutlich: Die Funktion gibt die Länge eines Strings zurück.

Beispiele:

Length('Hallo Welt')

Ergebnis ist 10. Das ist wirklich nicht schwierig.

Die Funktion StringReplace: (Zeichen im String austauschen)

Die Definition gemäß Delphi-Hilfe

type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

Beschreibung

Mit StringReplace ersetzen Sie in dem angegebenen String den im Parameter OldPattern festgelegten Sub-String mit dem im Parameter NewPattern übergebenen neuen Sub-String. StringReplace nimmt an, daß der String Multibyte-Zeichen enthalten kann.

Wenn im Parameter Flags nicht rfReplaceAll enthalten ist, wird nur das erste Vorkommen von OldPattern im String S ersetzt. Andernfalls werden alle Instanzen von OldPattern durch NewPattern ersetzt.

Wenn der Parameter Flags rfIgnoreCase enthält, wird die Groß-/Kleinschreibung nicht berücksichtigt.

Kommentar

Bevor es diese Funktion gab, benötigte man eine Kombination aus den Funktionen und Prozeduren Pos, Delete, Insert und AnsiUpperCase, um das nachzubilden. Das war schon ziemlich lästig.

Was macht diese Funktion?

Es wird in einem String das vorkommen des Teil-Strings OldPattern geprüft. Ist es vorhanden, wird es durch den String NewPattern ersetzt. Dabei können diese Teil-Strings auch unterschiedlich lang sein. Wenn NewPattern ein Leer-String ist, wird NewPattern einfach nur gelöscht. Nun kann der Funktion noch mitgeteilt werden, ob nur das erste Vorkommen von OldPattern ausgetauscht werden soll oder alle Stellen. Dazu wird das Flag rfReplaceAll benötigt. Wird das zweite Flag (rfIgnoreCase) gesetzt, ignoriert die Funktion die Groß-/Kleinschreibung. Für ein Suchen-Ersetzen-Funktion (z.B.: Text in einem TMemo) in einem Programm, ist diese Funktion hervorragend geeignet.

Beispiele:

StringReplace('aufwändige Käseherstellung', 'ä', 'ae', [rfReplaceAll])

Ergebnis ist "aufwaendige Kaeseherstellung". Alle "ä" wurden durch "ae" ersetzt. So kann man Umlautprobleme umgehen.

StringReplace('Haushalt', 'h', 'm', [rfReplaceAll, rfIgnoreCase])

Ergebnis ist "MausMalt". Auch wenn Mäuse nicht malen können, zeigt dieses Beispiel ein Problem auf. Die Funktion ignoriert zwar bei der Suche die Groß-Kleinschreibung, aber nicht beim Ersetzen.

StringReplace('Haushalt', 'H', 'm', [rfReplaceAll])

Ergebnis ist "maushalt". Auch ganz nett. Hier sieht man, was passiert, wenn die Schreibweise berücksichtigt wird.

StringReplace('Haushalt', 'h', 'm', [rfIgnoreCase])

Das selbe Ergebnis. Diesmal aber, weil nur das erste Vorkommen ersetzt wird.

StringReplace('Haushalt', 'h', 'm', [])

Ergebnis ist "Haushalt". Es gibt keinen Suchtreffer.

StringReplace('Haushalt', 'H', 'm', [])

Ergebnis ist "Maushalt".

Die Funktion Trim: (Leerzeichen am Anfang und am Ende eines Strings entfernen)

Die Definition gemäß Delphi-Hilfe

function Trim(const S: string): string;

Beschreibung

Trim entfernt entfernt alle am Anfang und Ende des mit S angegebenen Strings vorhandenen Leer- und Steuerzeichen.

Kommentar

Sehr nützlich Funktion um Eingaben von Anwendern aufzubereiten. Wir Programmierer wissen ja, dass Leerzeichen in der EDV berücksichtigt werden. Anwender wissen das in der Regel nicht. Also müssen wir uns darum kümmern. Gerade bei Datenbankanwendungen eine sehr nützliche Sache.
Es gibt dazu auch noch die Funktionen LTrim und RTrim. Sie arbeiten beide wie die Trim-Funktion. LTrim löscht aber nur die Leer- und Steuerzeichen am Anfang des Strings und RTrim die am Ende.

Was macht diese Funktion?

Die Delphi-Hilfe ist da schon ziemlich klar verständlich.

Beispiele:

entfällt

zu trivial

Die Funktion AnsiUpperCase: (String in Großschrift ändern)

Die Definition gemäß Delphi-Hilfe

function AnsiUpperCase(const S: string): string;

Beschreibung

AnsiUpperCase gibt eine Kopie des in S angegebenen Strings in einem groß geschriebenen String zurück. Bei der Konvertierung wird das aktuelle Windows-Gebietsschema berücksichtigt.

Hinweis

Diese Funktion unterstützt Multibyte-Zeichensätze (MBCS).

Kommentar

Sehr nützliche Funktion bei Stringvergleichen. Muss ein vom Anwender eingegebener String mit einem im Programm hinterlegten String verglichen werden, sollte in vielen Fällen die schreibweise egal sein. Bei Passwörtern machen wir natürlich ein Ausnahme. Es gibt noch eine andere Funktion, UpperCase, die fast das gleiche macht. Der Vorteil bei AnsiUpperCase ist, dass dort auch regionale Sonderzeichen (bei uns z.B. die Umlaute) berücksichtigt werden. Daher die Empfehlung AnsiUpperCase zu verwenden. Entsprechend gibt es auch eine Funktion AnsiLowerCase.

Was macht diese Funktion?

Sie wandelt alle Zeichen eines Strings in Großbuchstaben um.

Beispiele:

entfällt

zu trivial

[Startseite] [Wichtige Links] [Tutorials] [Downloads] [FAQ] [Buchvorstellung]

[Haftung] [Datenschutz] [Impressum] [Gästebuch] [Chat]