Verweis: | ExtractWord ExtractSubstr |
Uses: | StrUtils |
Eingabe: | SuchText(String),Satz(String) |
Ausgabe: | Position(index) |
Funktion: | Sucht in einem String nach einem, durch einen Joker zum Teil unbestimmten Text und gibt die Fundposition als Ganzzahl zurück. |
Beispiel 1
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton auf die Form. Binden Sie die Unit StrUtils mit der Uses-Klausel in die Anwendung ein. Doppelklicken sie auf den Button und ersetzen Sie das Ereignis durch folgenden Quelltext:
procedure TForm1.Button1Click(Sender: TObject);
const
Reime: array[1..6] of string =
('Esel ist Grau.', 'Der Hund bellt.',
'Der Ofenist heiß.', 'Halt den Mund.',
'Gib mir deine Hand.', 'Der Ball ist Rund.');
var
Stueck: string;
F: integer;
begin
// Ein Fragezeichen für ein anderes Zeichen.
Stueck := '?und';
for F := 1 to high(Reime) do
begin
if FindPart(Stueck, Reime[F]) > 0 then
ShowMessage('In diesem Satz:' + LineEnding + Reime[f] + LineEnding +
'Reimt sich was auf --> ' + Stueck);
end;
end;
Die Funktion FindPart sucht in einem String nach einem, von uns Vorgegebenen Teilstring. Hierbei werden die variablen Stellen durch ein „?“ Fragezeichen ersetzt. Die Fundposition wird als Ganzzahl zurück gegeben. Sollten wir, wie in dem Beispiel nur nach dem Vorkommen Testen wollen reicht die Prüfung auf 0.
if FindPart(Stueck, Reime[F]) > 0 then
Denn sollte der Text nicht vorhanden sein, so gibt diese Funktion 0 zurück. Wenn Sie diese Funktion so verwenden, dann können Sie auch problemlos mit Umlauten arbeiten.
Beispiel 2
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton auf die Form. Binden Sie die Unit StrUtils mit der Uses-Klausel in die Anwendung ein. Doppelklicken sie auf den Button und ersetzen Sie das Ereignis durch folgenden Quelltext:
procedure TForm1.Button1Click(Sender: TObject);
const
Reime: array[1..6] of string =
('Esel ist Grau.', 'Er quält den Hund.',
'Der Ofenist heiß.', 'Halt den Mund.',
'Gib mir deine Hand.', 'Die Bälle sind Rund.');
var
Stueck: string;
F, FundStelle: integer;
begin
// Ein Fragezeichen für ein anderes Zeichen.
Stueck := '?und';
for F := 1 to high(Reime) do
begin
FundStelle := FindPart(Stueck, Reime[F]);
if FundStelle > 0 then
ShowMessage('In diesem Satz:' + LineEnding + Reime[f] +
LineEnding + 'Habe ich ' + Stueck + LineEnding + 'An der Position: ' +
IntToStr(FundStelle) + ' gefunden.');
end;
end;
Hier in dem Beispiel haben wir die Umlaute einmal eingebettet. Und schon haben wir die altbekannten Probleme. Auch diese Funktion zählt eigentlich nur die Bytes und nicht die Zeichen. Wenn Sie wir uns nun die Positionen anschauen, dann kommen wir zu folgendem Ergebnis.
- Er quält den Hund. – verzählt wegen ä denn Position für ist 14.
- Halt den Mund. Alles okay Position für M von Mund ist 10.
- Die Bälle sind Rund. – Daneben Rund hat Position 16 nicht 17.
Wieder ein Umlautproblem.
Das ist schlecht. In wie weit das schlimm für Ihr Programm ist hängt davon ab, ob sie mit dem Positionswert rechnen wollen. wenn sie nun ab dieser Position weiter rechnen. Also Position +3 dann bekommen Sie die nächsten 3 Zeichen, sofern dort kein Umlaut ist, ist das auch okay. Besser noch sie suchen nach der nächsten Position und haben wieder den Falschen wert, was dann aber nicht interessiert. Sollten Sie aber mit einer Länge von Vorne des Textes rechnen oder aber von einer anderen festgelegten Stelle, dann werden Sie mit dem Befehl auf keinen Fall glücklich wenn Sie Umlaute haben.