#3 oxidián
já na to mám v tý mojí knihovně Typ a funkci
TArrayOfString : array of string; - stejné používání jako normální Array
function TextParser(separator, text: string): TArrayOfString;
var
poz, cnt, lenSep: integer;
begin
SetLength(result, 0);
lenSep := length(separator);
///prázdný řetězec vrátí prázdné pole
if length(text) = 0 then
exit;
//separátor prázdný nebo delší než text vrátí v poli (index 0) text
if (lenSep = 0) or (lenSep > length(text)) then
begin
SetLength(result, 1);
result[0] := text;
exit;
end;
//nastavení délky pole na počet znaků řetězce, což je max. možný
//počet substringů, možná by se dalo použít na prázdný separátor,
//kdy by se text rozsekal do pole znaků po 1
SetLength(result, length(text));
cnt := 0;
poz := 0;
repeat
//prázdno za posledním separátorem
if length(text) = 0 then
begin
result[cnt] := '';
inc(cnt);
break;
end;
//zjisti pozici separatoru, když není další vlož do pole zbytek řetězce
poz := pos(separator, text);
if poz = 0 then
result[cnt] := text
else
begin
//tato podmínka je třeba kvůli více zn. separátorům
if length(text) >= poz then
begin
//separátor na začátku, vlož prázdný
if poz = 1 then
result[cnt] := ''
else
//jinak zkopíruj do pole začátek po separátor
result[cnt] := Copy(text, 1, poz - 1);
end;
//smaž začátek včetně celého separátoru
delete(text, 1, poz + lenSep - 1);
end;
inc(cnt); //inkrementace counteru pole
until poz = 0;
//uprav-zmenši na skutečnou velikost pole
SetLength(result, cnt);
end;
jsou tam ošetřené snad všechny myslitelné situace, od víceznakových oddělovačů, po prázdné řetězce včetně prázdného za posledním oddělovačem a je to včetně duplicit.
EDIT: Okomentoval jsem pro tebe tu funkci, abys případně věděl co a jak to dělá
a přesunul upravil jsem 2 řádky jen pro přehlednost, funkční byla i původní verze.