Delphi 如何用多字符分隔符分割字符串?

Delphi 如何用多字符分隔符分割字符串?,delphi,delphi-2010,Delphi,Delphi 2010,是否有Delphi函数可以通过多字符分隔符而不是单个字符分割字符串 例如,当我以这种方式使用该函数时: SplitString('Whale<->Mammal<->Ocean', '<->') Delphi中有这样的函数吗?我不知道Delphi是否有一个使用字符串作为分隔符的标准分割过程。但你可以自己写,不管有没有: procedure SplitStr(const Source, Delimiter: String; var DelimitedList:

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

例如,当我以这种方式使用该函数时:

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

Delphi中有这样的函数吗?

我不知道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;

希望对您有所帮助。

没有“从盒子”这样的功能。如果字符串包含常规的“良好”文本,则可以使用StringReplace替换为外来符号,否则使用Pos或IdStrings.SplitString编写自己的拆分函数并不困难(如果D2010中提供)


您可以检查我的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;

支持字符串作为分隔符,也支持多个分隔符。

使用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;
程序TForm208.按钮1点击(发件人:TObject);
变量
lst:TStringList;
开始
lst:=TStringList.Create;
尝试
lst.LineBreak:='';
第一个文本:=“Whalemmalocean”;
备注1.行:=lst;
最后
一、免费;
结束;
结束;
如果已安装,则在
jclStrings
单元中有
strotstrings
过程:

var sl: TStringList;
begin
  sl := TStringList.Create;
  StrToStrings('Whale<->Mammal<->Ocean' , '<->' , sl);
var-sl:TStringList;
开始
sl:=TStringList.Create;
strotstrings('Whalemmalocean','',sl);

较新版本的Delphi有一个stringhelper,可以执行以下操作:

var
  lStr: string;
  lSplitStr: TArray<string>;
begin
  lStr := 'Whale<->Mammal<->Ocean';
  lSplitStr := lStr.Split('<->');
end;
var
lStr:字符串;
lSplitStr:TArray;
开始
lStr:=“Whalemmalocean”;
lSplitStr:=第一次拆分(“”);
结束;

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

我能看到的唯一问题是,如果文本包含“外来符号”,此方法将不起作用(如您所指出的)。您通常可以在ASCII不可打印部分的字符串中找到一个不使用的“外来符号”,例如#13(回车)或#8(钟形)。对于所有亲密的选民:请阅读这两个问题。这显然不是一个骗局,你应该使用“StrictDelimiter”?还是在这种情况下它不重要?@awmross,因为我们在这里不使用DelimitedText,StrictDelimiter的状态根本不重要。我以前从未听说过Cromis。Cromis有任何单元测试吗?我在downl中找不到任何单元测试另外,在线浏览代码或者至少一些API文档(只是一个建议)也不错这是我在很多生产代码中使用的一个库,如果其他人愿意的话,我会将它共享给他们。我仍然需要在一些单元中进行测试。对于大多数主要部分,我都有涵盖大部分功能的演示程序。我会扩展测试范围,并将SVN公开。但是文档可能会很晚,因为我这些天没有太多时间。S一些组件被很多人使用,特别是IPC和Scheduler。相信您在另一个答案中发布的源,它只会在分隔符上标记一次,也不会以任意顺序标记所有分隔符。
var sl: TStringList;
begin
  sl := TStringList.Create;
  StrToStrings('Whale<->Mammal<->Ocean' , '<->' , sl);
var
  lStr: string;
  lSplitStr: TArray<string>;
begin
  lStr := 'Whale<->Mammal<->Ocean';
  lSplitStr := lStr.Split('<->');
end;