18

是否有 Delphi 函数通过多字符分隔符而不是单个字符来分割字符串?

例如,当我以这种方式使用该功能时:

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

我会得到这三个字符串的结果:

'Whale', 'Mammal', 'Ocean'

Delphi中有这样的功能吗?

4

6 回答 6

41

There is another quite simple solution using TStringList. Change the 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;
于 2013-03-15T08:17:21.260 回答
7

您可以查看我的 StringUtils.pas 单元,它是Cromis 库的一部分

那里有一个简单的文本标记器。但可能正是您所需要的。界面是这样的

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

'from box' 没有这样的功能。如果您的字符串包含常规的“好”文本,那么您可以使用带有奇异符号的 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 回答
0

较新版本的 Delphi 有一个 stringhelper 可以做到这一点:

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

现在 lSplitStr 是一个包含 3 个元素的数组:“鲸鱼”、“哺乳动物”、“海洋”。

于 2020-03-22T10:54:00.540 回答