Stringverarbeitung mit Delphi

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.

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:

1
2
3
4
5
6
  s := 'Test = 5';
  Position := Pos('=', s);
  if Position <> 0 then
    ShowMessage('gefunden an Position: '  + IntToStr(Position))
  else
    ShowMessage('nicht im String vorhanden');
Achtung

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:

PosEx
1
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 Delphi7. Diese Funktion lässt sich aber leicht nachbauen:
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  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.

Copy

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:

1
2
3
  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.

Delete

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:

1
2
3
4
5
  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.

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

Source: der String der in den anderen eingefügt werden sol
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.

1
2
3
4
5
  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.

StringReplace
1
2
3
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 1:

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

Beispiel 2:

1
2
3
  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:

1
2
3
  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:

AnsiUpperCase

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:

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

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

1
2
3
4
5
6
  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 sehr einfache Funktion. Sie 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 ‚ und man kann nicht unbedingt von einem User erwarten, dass er diesen Unterschied kennt. Insbesondere bei Eingabe von Benutzernamen o.ä. kann es sonst zu Problemen kommen…

Trim

function Trim(S: string): string;

S: der String, bei dem Leerzeichen vorne 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 bzw. nur rechts Steuerzeichen abschneiden.

Kapitel: | Zurück | 1 | 2 | 3 | 4 | Weiter |

3 Kommentare


  1. @Embarcadero (falls das jemand liest): Wär doch mal was, das direkt in die System.pas zu packen; könntet ihr auch gleich in eure elendslange Changelog-Datei schreiben und als neues Feature anpreisen 😉


  2. @Embarcadero (falls das jemand liest)

    Meinst du ehrlich?

    Wär doch mal was, das direkt in die System.pas zu packen

    Ein Tutorial in der System.pas? Ob das so sinnvoll ist… *kopfkratz*


  3. Hmm wollt das eigentlich zu der LastPos()-Funktion dazuschreiben, allerdings wird das dann zum gesamten Tutorial kommentiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert