Semblable à la Explode() La fonction proposée par Mef, mais avec quelques différences (dont une que je considère comme une correction de bug) :
type
TArrayOfString = array of String;
function SplitString(const aSeparator, aString: String; aMax: Integer = 0): TArrayOfString;
var
i, strt, cnt: Integer;
sepLen: Integer;
procedure AddString(aEnd: Integer = -1);
var
endPos: Integer;
begin
if (aEnd = -1) then
endPos := i
else
endPos := aEnd + 1;
if (strt < endPos) then
result[cnt] := Copy(aString, strt, endPos - strt)
else
result[cnt] := '';
Inc(cnt);
end;
begin
if (aString = '') or (aMax < 0) then
begin
SetLength(result, 0);
EXIT;
end;
if (aSeparator = '') then
begin
SetLength(result, 1);
result[0] := aString;
EXIT;
end;
sepLen := Length(aSeparator);
SetLength(result, (Length(aString) div sepLen) + 1);
i := 1;
strt := i;
cnt := 0;
while (i <= (Length(aString)- sepLen + 1)) do
begin
if (aString[i] = aSeparator[1]) then
if (Copy(aString, i, sepLen) = aSeparator) then
begin
AddString;
if (cnt = aMax) then
begin
SetLength(result, cnt);
EXIT;
end;
Inc(i, sepLen - 1);
strt := i + 1;
end;
Inc(i);
end;
AddString(Length(aString));
SetLength(result, cnt);
end;
Différences :
- un paramètreMax limite le nombre de chaînes de caractères à renvoyer
- Si la chaîne d'entrée est terminée par un séparateur, on considère qu'il existe une chaîne finale nominale "vide".
Exemples :
SplitString(':', 'abc') returns : result[0] = abc
SplitString(':', 'a:b:c:') returns : result[0] = a
result[1] = b
result[2] = c
result[3] = <empty string>
SplitString(':', 'a:b:c:', 2) returns: result[0] = a
result[1] = b
C'est le séparateur de fin de ligne et l'"élément final vide" théorique que je considère comme la correction du bug.
J'ai également incorporé le changement d'allocation de mémoire que j'ai suggéré, avec un raffinement (j'ai suggéré par erreur que la chaîne d'entrée pouvait contenir au maximum 50% de séparateurs, mais il est concevable qu'elle puisse bien sûr consister en 100% de chaînes de séparateurs, ce qui donne un tableau d'éléments vides !)