Die wichtigsten Funktionen
- Überblick
- Die wichtigsten Funktionen
- Mal ein paar anspruchsvollere Beispiele
- String-Funktionen selbst gemacht
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:
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'); |
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:
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.
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 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.
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.
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.
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:
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…
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.
Permalink
@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 😉
Permalink
Meinst du ehrlich?
Ein Tutorial in der System.pas? Ob das so sinnvoll ist… *kopfkratz*
Permalink
Hmm wollt das eigentlich zu der LastPos()-Funktion dazuschreiben, allerdings wird das dann zum gesamten Tutorial kommentiert.