Splitting a string in an dynamic array

A function that splits a string in parts separated by a substring

and returns the parts in a dynamic string array

Splitting a string in an array



The following functions split a string in parts separated by a substring and return the parts in a dynamic string array:



interface



  type

    TStringArray = array of string;



  function Split(const str: string;

                 const separator: string = ','): TStringArray;

  function AnsiSplit(const str: string;

                     const separator: string = ','): TStringArray;



  implementation



  uses sysutils;



  function Split(const str: string;

                 const separator: string): TStringArray;

  // Returns an array with the parts of "str" separated by "separator"

  var

    i, n: integer;

    p, q, s: PChar;

  begin

    SetLength(Result, Occurs(str, separator)+1);

    p := PChar(str);

    s := PChar(separator);

    n := Length(separator);

    i := 0;

    repeat

      q := StrPos(p, s);

      if q = nil then q := StrScan(p, #0);

      SetString(Result[i], p, q - p);

      p := q + n;


      inc(i);

    until q^ = #0;

  end;



  function AnsiSplit(const str: string;

                     const separator: string): TStringArray;

  // Returns an array with the parts of "str" separated by "separator"

  // ANSI version

  var

    i, n: integer;

    p, q, s: PChar;

  begin

    SetLength(Result, AnsiOccurs(str, separator)+1);

    p := PChar(str);

    s := PChar(separator);

    n := Length(separator);

    i := 0;

    repeat

      q := AnsiStrPos(p, s);

      if q = nil then q := AnsiStrScan(p, #0);

      SetString(Result[i], p, q - p);

      p := q + n;

      inc(i);

    until q^ = #0;

  end;


Example:



procedure TForm1.Button1Click(Sender: TObject);

  var

    a: TStringArray;

    i: integer;

  begin

    a := Split('part1,part2,part3');

    for i := 0 to Length(a) - 1 do begin // Will show three dialogs

      ShowMessage(a[i]); // 'part1', 'part2', 'part3'

    end;

  end;


You can see an example using a StringList instead of a dynamic array in a separate article.

 

Share this article!

Follow us!

Find more helpful articles: