Hallo Sebastian,
man kämpft eigentlich immer an zwei Fronten: Problemverständnis und Lösungsansatz. Hier mal deine Problembeschreibung nach meinem Verständnis:
Problem Statement
Gegeben ist ein
ANSI kodierter String mit folgendem Aufbau: Substring *(Separator Substring). Einem Substring folgen beliebig viele weitere Substrings, die durch einen Separator vom vorhergehenden Substring abgesetzt sind, wobei der Separator wechseln kann und aus beliebig vielen Zeichen bestehen darf.
Das lässt sich wunderbar über Regular Expressions lösen, aber auch prozedural:
Delphi-Quellcode:
procedure Split(const line: string; const separators: array of string; strings: TStrings);
var
iPos, iSep, iStart: Integer;
begin
if Length(separators) = 0 then
strings.Text := line else
begin
strings.Clear;
iStart := 1;
iSep := 0;
while iStart <= Length(line) do
begin
if iSep < Length(separators)
then iPos := PosEx(separators[iSep], line, iStart)
else iPos := 0;
if iPos = 0 then
begin
strings.Add(Trim(Copy(line, iStart, MaxInt)));
iStart := Succ(Length(line));
end else
begin
strings.Add(Trim(Copy(line, iStart, iPos - iStart)));
iStart := iPos + Length(separators[iSep]);
iSep := Succ(iSep);
end;
end;
end;
end;
procedure TDemoForm.TestButtonClick(Sender: TObject);
begin
Split(
'von Kalkreuth Elfi Bad Salzuflen An der Burg 42 +49 69 1234-567',
[' ', ' ', ' ', ' ', ' '],
Memo.Lines
);
end;
Deine Funktion Split() macht etwas ganz anderes. Wenn du ein Problem nicht zweifelsfrei beschreiben kannst, dann sind repräsentative Daten oft sehr hilfreich.
Die von dir beschriebenen Trenner bergen die Gefahr, dass sie auch als Bestandteil eines Substring auftreten können, wenn keine Vorkehrungen getroffen werden, die das verhindern. Dieses Problem wird beim Format
Comma Separated Values (CSV) u.a. durch Einführung eines Feldbegrenzungszeichens gelöst.
Grüße vom marabu