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