Arrays 帕斯卡';拆分';作用

Arrays 帕斯卡';拆分';作用,arrays,string,delphi,split,pascal,Arrays,String,Delphi,Split,Pascal,我正在用pascal编写一个小程序,遇到了一个小问题。在其他语言中,有一个名为“split”或“explode”的函数,用于获取一个以定义的字符为标点的长字符串,并将该长字符串拆分为几个较小的字符串,然后将其分配给数组。 我的意思是,我想这样做: longstring:='Word1.Word2.Word3'); Split('.', longstring, OutPutVariable) ; { OutPutVariable[1] would be Word1} { OutPutVaria

我正在用pascal编写一个小程序,遇到了一个小问题。在其他语言中,有一个名为“split”或“explode”的函数,用于获取一个以定义的字符为标点的长字符串,并将该长字符串拆分为几个较小的字符串,然后将其分配给数组。 我的意思是,我想这样做:

longstring:='Word1.Word2.Word3');

Split('.', longstring, OutPutVariable) ;

{ OutPutVariable[1] would be Word1}
{ OutPutVariable[2] would be Word2}
{ OutPutVariable[3] would be Word3}

这不是真正的代码,因为pascal中不存在“split”。我认为它存在于德尔福。有人能帮我解决这个问题吗?很抱歉,如果这是一个非常简单的问题,我对使用
TStringList
编程是新手,请执行以下操作:

procedure SplitText(aDelimiter: Char; const s: String; aList: TStringList);
begin
  aList.Delimiter := aDelimiter;
  aList.StrictDelimiter := True; // Spaces excluded from being a delimiter
  aList.DelimitedText := s;
end;
注意:该属性是在D2006中添加的

另一种方式:

procedure SplitText(const aDelimiter,s: String; aList: TStringList);
begin
  aList.LineBreak := aDelimiter;
  aList.Text := s;
end;

可以使用多个字符作为分隔符。

Delphi RTL已经具有所需的精确功能,可从
系统中使用。StrUtils
单元:

function SplitString(const S, Delimiters: string): TStringDynArray;
记录为:

将字符串拆分为由指定字符串分隔的不同部分 分隔符字符

SplitString将字符串拆分为由分隔符分隔的不同部分 指定的分隔符字符。S是要拆分的字符串。 分隔符是包含定义为的字符的字符串 分隔符

SplitString返回类型为的字符串数组 System.Types.TStringDynArray,其中包含 原始字符串


嗯,每个人都在这里发布他们的传统答案,我也一样

我看到已经发布了两个答案,但我不知道第四个答案(基于PChar的ExtractString)是否会在这个DUP关闭之前发布

总的来说,这是一个副本,所有的答案都可以在那里看到

现在

如果你坚持你的原始索引

{ OutPutVariable[1] would be Word1}
{ OutPutVariable[2] would be Word2}
{ OutPutVariable[3] would be Word3}
然后添加第0个字符串的存根

OutPutVariable := JclStringList().Split('.Word1.Word2.Word3','.');

它还提供了连接和许多其他功能


PS:4th variant是

您使用Delphi标记的,因此如果您使用Delphi XE或更高版本,您可以使用,如果不是,这在这里已经实现了多次。可能是@KenWhite的重复,不是的,这个问题更多的是针对带有多个分隔符的表达式解析器。我想说这是+1的重复,类似的想法,但您的实现更好。除了它不编译,我会添加一个
ASSERT(list nil)开头。请注意,DelimitedText包含对QuoteChar的处理,因此它与.net的
字符串不完全匹配。Split
@GerryColl,正确。设置
list.QuoteChar:=#0
将消除这种可能性,或者只使用
LineBreak
过程。您可能应该补充一点,这仅在Delphi XE和更高版本中可用。@jpfollenius我实际上不知道这一点。但是XE现在已经很古老了。@jpfollenius,如果标签或问题中没有提到其他内容,我总是假设问题发布时的Delphi版本是最新版本。如果有人想要具体的答案,他应该更准确地问自己的问题。此外,这个答案可能对其他人有帮助,即使对OP没有帮助。@uwerabe当然有!我没有批评答案(事实上是投了赞成票),只是建议进行一个小的编辑。@jpfollenius对于pre-XE Delphi还有另一个功能:
{ OutPutVariable[1] would be Word1}
{ OutPutVariable[2] would be Word2}
{ OutPutVariable[3] would be Word3}
OutPutVariable := JclStringList().Split('.Word1.Word2.Word3','.');
OutPutVariable := JclStringList().Add('').Split('Word1.Word2.Word3','.', False);