Home » Tutorials » Object Pascal/RTL » Stringverarbeitung

Stringverarbeitung

Die wichtigsten Funktionen

Pos

Will man prüfen, ob ein Teilstring in einem String vorkommt, bzw. will man die Stelle ermitteln, an der dieser Teilstring vorkommt, so benutzt man die Funktion Pos.
function Pos(SubStr: string; S: string): Integer;

SubStr: der String, nach dem gesucht werden soll
S: der String, in dem gesucht werden soll
Rückgabewert: die Position, an der der Teilstring gefunden wurde; ansonsten 0
So kann man in einem String suchen:

s := 'Test = 5';
Position := Pos('=', s);
if Position <> 0 then
  ShowMessage('gefunden an Position: '  + IntToStr(Position))
else
  ShowMessage('nicht im string vorhanden');

Die Beschreibung der Funktion Pos in der deutschen Hilfe von Delphi ist fehlerhaft. Entgegen der dortigen Aussage unterscheidet die Funktion sehr wohl zwischen Groß- und Kleinschreibung.

PosEx

Will man ab einer bestimmten Position suchen, kann man PosEx benutzen:
function PosEx(SubStr: string, S: string, Offset: Integer): Integer;

SubStr: der String, nach dem gesucht werden soll
S: der String, in dem gesucht werden soll
Offset: die Position, an der die Suche starten soll
Rückgabewert: die Position, an der der Teilstring gefunden wurde; ansonsten 0
PosEx gibts erst seit Delphi 7. Lässt sich aber leicht nachbauen:

function PosEx(const Substr: string; const S: string; Offset: Integer): Integer;
begin
  if Offset <= 0 then Result := 0 
  else
    Result := Pos(Substr, Copy(S, Offset, Length(S)));

  if Result <> 0 then
    Result := Result + Offset - 1;
end;

(Quelle: http://www.delphipraxis.net/post537369.html#537369, http://www.delphipraxis.net/post409954.html#409954)

Beispiel

Wir wollen in einem String die Position des zweiten Semikolons herausfinden:

s := 'Hallo; Guten Tag; Guten Morgen; Guten Abend;';
Pos1 := Pos(';', s);
if Pos1 <> 0 then  // erstes Semikolon gefunden
begin
  // Position des zweiten Semikolons ermitteln;
  // dazu fangen wir gleich nach dem ersten Semikolon an zu suchen:
  Pos2 := PosEx(';', s, Pos1 + 1);   
  if Pos2 <> 0 then
    ShowMessage('gefunden an Position: '  + IntToStr(Pos2))
  else
    ShowMessage('nur ein Semikolon im String vorhanden');
  end
  else
  begin
    ShowMessage('kein Semikolon im String vorhanden');
  end;

Copy

Die Funktion Copy ist gewissermaßen das Gegenstück zu Pos. Pos sucht die Stelle, an der sich ein gegebener Teilstring befindet. Copy hingegen gibt den Teilstring zurück, der sich an einer gegebenen Stelle befindet.
function Copy(S: string; Index, Count: Integer): String;

S: der String, in dem sich der gesuchte Teilstring befindet
Index: die Stelle, an der sich der Teilstring befindet
Count: die Länge des gesuchten Teilstrings
Rückgabewert: der Teilstring an der Stelle mit Zeichen Länge
Mit Copy kann man also bestimmte Stellen aus einem String herauskopieren.
Beispiel:
Wir möchten die ersten 25 Zeichen eines Strings ausgeben:

s := 'Das ist der Anfang eines sehr, sehr langen Textes, der unbedingt gekürzt werden muss.';
SubStr := Copy(s, 1, 25);
ShowMessage(SubStr + '...');

Delete

Die Prozedur Delete löscht, wie der Name schon sagt, einen Teil aus einem String. Dabei wird – im Gegensatz zu Pos(Ex) und Copy – der String selbst verändert.
procedure Delete(var S: string; Index, Count:Integer);

S: der String, aus dem ein Teil gelöscht werden soll
Index: die Position, an der gelöscht werden soll
Count: die Anzahl der Zeichen, die gelöscht werden sollen

Beispiel

s := 'Das ist ein relativ kurzer Text.';
Delete(s, 13, 8);
ShowMessage(s); // Ausgabe: Das ist ein kurzer Text
Delete(s, 13, 7);
ShowMessage(s); // Ausgabe: Das ist ein Text

Insert

Das Gegenstück zu Delete heißt Insert und fügt in einen String einen anderen String ein.
procedure Insert(Source: string; var S: string; Index: Integer);

Source: der String, der in den anderen eingefügt werden soll
S: der String, in den eingefügt werden soll
Index: die Stelle, an der eingefügt werden soll
Das letzte Beispiel einfach mal rückwärts:
Wir stellen nun mit Insert den Ursprungszustand unseres Strings wieder her, indem wir die herausgelöschten Teile wieder einfügen.

s := 'Das ist ein Text. ';
Insert('kurzer ', s, 13);
ShowMessage(s); // Ausgabe: Das ist ein kurzer Text
Insert('relativ ', s, 13); 
ShowMessage(s);   // Ausgabe: Das ist ein relativ kurzer Text

StringReplace

StringReplace ist gewissermaßen eine Verbindung aus Pos, Insert und Delete. Wie im Suchen und Ersetzen-Dialog, den man in diversen Programmen (auch in Delphi) findet, ersetzt diese Funktion bestimmte Teilstrings durch andere. Der Unterschied ist allerdings, dass es sich hier um eine Funktion handelt. Der als Parameter übergebene String wird nicht verändert, sondern der veränderte String zurückgegeben.
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

function StringReplace(S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

S: der String, in dem alles passieren soll
OldPattern: der Teilstring, der ersetzt werden soll
NewPattern: der Teilstring, der eingesetzt werden soll
Flags: gibt an, ob alle Vorkommen ersetzt werden sollen und ob auf Groß-/Kleinschreibung geachtet werden soll

Beispiel

s := 'Hallo, Guten Tag, Guten Morgen, Guten Abend, Gute Nacht';
s := StringReplace(s, ',', ';', [rfReplaceAll]); // ersetzt alle Kommas durch Semokolons
ShowMessage(s);

Beispiel 2

s := 'Hallo, Guten Tag, guten Morgen, GUTEN Abend, Gute Nacht';
s := StringReplace(s, 'guten', 'Schönen', [rfReplaceAll, rfIgnoreCase]);
ShowMessage(s);

Ausgabe: ‚Hallo, Schönen Tag, Schönen Morgen, Schönen Abend, Gute Nacht‘

Length

Length ist wohl die einfachste Funktion zur „Stringverarbeitung“. Sie gibt einfach die Länge des Strings zurück:

s := 'Hallo';
Laenge:= Length(s);
ShowMessage(IntToStr(Laenge)); // Ausgabe: 5

AnsiLowerCase und AnsiUpperCase

Die einzige Funktion, bei der wir entscheiden können, ob Groß/Kleinschreibung eine Rolle spielt, ist StringReplace. Alle anderen bisher genannten Funktionen sind CaseSensitive, d.h. ‚a‘ ist etwas anderes als ‚A‘. Um hier trotzdem von der Groß/Kleinschreibung unabhängig zu sein, kann man diese Funktionen benutzen:
AnsiUpperCase wandelt einen String in Großbuchstaben um:
function AnsiUpperCase(S: string): string;

S: der String, der in Großbuchstaben umgewandelt werden soll
Rückgabewert: der in Großbuchstaben umgewandelte String
AnsiLowerCase funktioniert genauso, nur wird hier der String in Kleinbuchstaben umgewandelt.
Die Funktionen UpperCase und LowerCase (man beachte das fehlende ‚Ansi‘) gibt es ebenfalls. Im Gegensatz zu den oben genannten Funktionen AnsiUpperCase und AnsiLowerCase berücksichtigen sie keine Umlaute. Deshalb sollte man – wenigstens im deutschen Sprachraum – AnsiUppeCase bzw. AnsiLowerCase benutzen.

Beispiel 1

s := 'Test';
s2 := AnsiUpperCase(s)
ShowMessage(s2); // Ausgebe: TEST

Beispiel 2

Suchen nach einem Teilstring ohne Berücksichtigung der Groß-/Kleinschreibung:

s := 'Das ist ein Teststring in dem das Wort DeLpHi drin vorkommt.';
Position := Pos('delphi', AnsiLowerCase(s));
if Position <> 0 then
  ShowMessage('gefunden an Position: '  + IntToStr(Position))
else
  ShowMessage('nicht im String vorhanden');

Trim

Trim ist auch eine ganz einfache Funktion. Diese Funktion schneidet Leerzeichen und Steuerzeichen (z.B. Zeilenumbrüche) am Anfang und Ende eines Strings ab. Das ist oft nötig, denn ‚Hallo‘ ist nicht ‚Hallo ‚…
function Trim(S: string): string;

S: der String, bei dem Leerzeichen vorn und hinten abgeschnitten werden sollen
Rückgabewert: der String ohne Leerzeichen vorn und hinten
Zusätzlich zu Trim() gibt es auch noch TrimLeft() und TrimRight(), die eben nur links oder nur rechts Steuerzeichen abschneiden.