18

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

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

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

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

'Whale', 'Mammal', 'Ocean'

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

4

6 に答える 6

41

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

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;
于 2013-03-15T08:17:21.260 に答える
7

Cromisライブラリの一部である私の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;

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

于 2013-03-15T07:51:55.967 に答える
5

JCLがインストールされている場合は、jclStringsユニットに次のStrToStrings手順があります。

var sl: TStringList;
begin
  sl := TStringList.Create;
  StrToStrings('Whale<->Mammal<->Ocean' , '<->' , sl);
于 2013-03-15T08:38:43.827 に答える
4

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;

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

于 2013-03-15T04:13:55.833 に答える
3

'ボックスから'そのような関数はありません。文字列に通常の「適切な」テキストが含まれている場合は、エキゾチックなシンボルで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;
于 2013-03-15T04:21:15.323 に答える