[Delphi]文字列の分割を指定した文字列単位で行う

2 min読了の目安(約1900字TECH技術記事

特定のバージョンを明記しているもの以外は Delphi (Community Edition) 10.3.2 で確認済みです。

Classes.TStringList を使う方法

LineBreak プロパティにデリミタとして使いたい文字列を指定することで Strings[Index] から要素を取り出すことができます。

使用例

uses System.Classes;
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  SL.LineBreak := '<>';
  SL.Text := '2020/10/08<>23:33:59<>小雨';
  Writeln(SL.Strings[0]);
  SL.Free;
end;

必ず LineBreak を先に設定してから、区切る対象文字列を Text に代入します。

実行結果

2020/10/08

TStringHelper.Split を使う方法

String 型のレコードヘルパ[1] TStringHelper にある Split メソッドを使うと String 型からメソッドを呼び出す感覚で書けます。

使用例

uses System.SysUtils;
var
  Strings: TArray<String>;
  Item: String;
begin
  Strings := '2020/10/08<>23:33:59<>小雨'.Split(['<>']);
  for Item in Strings do begin
    Writeln(Item);
  end;
end;

Split の第1引数はオープン配列パラメータなので [ ] を書き忘れずに。
デリミタ文字列を複数指定することもできます。

実行結果

2020/10/08
23:33:59
小雨

Split 関数を自分で実装する

Delphi 6 以降で使用可能

uses SysUtils, Classes;
function Split(Text: String; Delimiter: String): TStringList;
var
  Index: Integer;
  TextLen: Integer;
  DelimLen: Integer;
  SPos: Integer;
begin
  Result := TStringList.Create;
  if Text = '' then Exit;
  TextLen := Length(Text);
  DelimLen := Length(Delimiter);
  Index := 1;
  SPos := 1;
  while Index <= TextLen do begin
    if StrLComp(PChar(Text) + Index - 1, PChar(Delimiter), DelimLen) = 0 then begin
      Result.Add(Copy(Text, SPos, Index - SPos));
      Inc(Index, DelimLen);
      SPos := Index;
      Continue;
    end;
    Inc(Index);
  end;
  Result.Add(Copy(Text, SPos, Index - SPos));
end;

使用例

var
  SL: TStringList;
  Index: Integer;
begin
  SL := Split('2020/10/08<>12:15:33<>曇り', '<>');
  for Index := 0 to SL.Count - 1 do begin
    Writeln('SL[', Index, '] = ', SL[Index]);
  end;
  SL.Free;
end;

TStringList を生成するので、使い終わったら Free する必要があります。

実行結果

SL[0] = 2020/10/08
SL[1] = 12:15:33
SL[2] = 曇り
脚注
  1. 既存のレコード型(構造体)やプリミティブ型にメソッドを追加することができる機能 ↩︎