web-dev-qa-db-ja.com

複数文字の区切り文字で文字列を分割するにはどうすればよいですか?

文字列を1文字ではなく複数文字の区切り文字で分割するDelphi関数はありますか?

たとえば、この関数を次のように使用する場合:

SplitString('Whale<->Mammal<->Ocean', '<->')

これらの3つの文字列の結果が得られます。

'Whale', 'Mammal', 'Ocean'

このためにDelphiにそのような機能はありますか?

17
awmross

TStringListを使用した別の非常に単純なソリューションがあります。 LineBreakを変更します。

procedure TForm208.Button1Click(Sender: TObject);
var
  lst: TStringList;
begin
  lst := TStringList.Create;
  try
    lst.LineBreak := '<->';
    lst.Text := 'Whale<->Mammal<->Ocean';
    Memo1.Lines := lst;
  finally
    lst.Free;
  end;
end;
38
Uwe Raabe

Cromis Library の一部である私のStringUtils.pasユニットを確認できます。

そこには簡単なテキストトークナイザーがあります。しかし、おそらくあなたが必要なものです。インターフェースはそのようなものです

TTextTokenizer = class
  private
    FTokens: TTokens;
    FDelimiters: array of ustring;
  public
    constructor Create;
    procedure Tokenize(const Text: ustring);
    procedure AddDelimiters(const Delimiters: array of ustring);
    property Tokens: TTokens read FTokens;
  end;

文字列を区切り文字として、また複数の区切り文字としてサポートします。

7
Runner

[〜#〜] jcl [〜#〜] がインストールされている場合、jclStringsユニットにはStrToStringsプロシージャがあります。

var sl: TStringList;
begin
  sl := TStringList.Create;
  StrToStrings('Whale<->Mammal<->Ocean' , '<->' , sl);
4
ain

Delphiに、文字列を区切り文字として使用する標準の分割プロシージャがあるかどうかはわかりません。しかし、あなたはそれが持っているかどうかにかかわらずあなた自身を書くことができます:

procedure SplitStr(const Source, Delimiter: String; var DelimitedList: TStringList);
var
  s: PChar;

  DelimiterIndex: Integer;
  Item: String;
begin
  s:=PChar(Source);

  repeat
    DelimiterIndex:=Pos(Delimiter, s);
    if DelimiterIndex=0 then Break;

    Item:=Copy(s, 1, DelimiterIndex-1);

    DelimitedList.Add(Item);

    inc(s, DelimiterIndex + Length(Delimiter)-1);
  until DelimiterIndex = 0;
  DelimitedList.Add(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl:=TStringList.Create;
  SplitStr('delphi++split++string++','++',sl);
  //do something with the list
  sl.Free;
end;

それが役に立てば幸い..

3
The_aLiEn

'ボックスから'そのような関数はありません。文字列に通常の「適切な」テキストが含まれている場合は、エキゾチックなシンボルでStringReplaceを使用できます。それ以外の場合は、PosまたはIdStrings.SplitStringを使用して独自の分割関数を作成することは難しくありません(D2010で使用可能な場合)。

function SplitStringByStr(const S, StrDelimiter: string): TStringDynArray;
var
  tmp: string;
begin
  tmp := StringReplace(S, StrDelimiter, '`', [rfReplaceAll]);
  Result := SplitString(tmp, '`');
end;
3
MBo

Delphiの新しいバージョンには、これを行うstringhelperがあります。

var
  lStr: string;
  lSplitStr: TArray<string>;
begin
  lStr := 'Whale<->Mammal<->Ocean';
  lSplitStr := lStr.Split('<->');
end;

これで、lSplitStrは、「クジラ」、「哺乳類」、「海」の3つの要素を持つ配列になります。

0
Hans