2009-08-26 37 views
48

我在TStringList类中的分隔符有问题。请看:德尔福:StringList分隔符总是空格字符,即使设置了分隔符

var 
    s: string; 
    sl: TStringList; 

begin 
    sl := TStringList.Create; 
    s := 'Users^foo bar^bar foo^foobar^barfoo'; 
    sl.Delimiter := '^'; 
    sl.DelimitedText := s; 
    ShowMessage(sl[1]); 
end; 

sl[1]应该返回'foo bar'

sl[1]不会返回'foo'

看来,分隔符现在'^'' '

任何想法?

+0

您正在使用什么版本的Delphi? – 2009-08-26 14:27:26

+0

我正在处理Delpi 7 – Acron 2009-08-26 14:37:40

+0

[将字符串拆分为基于分隔符的字符串数组](http://stackoverflow.com/questions/2625707/split-a-string-into-an-array基于字符串的分隔符) – Ampere 2013-11-26 17:20:38

回答

77

应设置为s1.StrictDelimiter := True空间不被认为是分隔符,更多信息here

既然你在不支持以上(作为答案提交后澄清)版本的工作,你有两个选择:

  1. 找到你知道一个字符将不会在原来的使用文本(例如下划线),在分割之前将所有空格转换为该字符,并在分割之后转换回来。这是robosoft的建议。
  2. 如果文本中没有引号和空格,可以使用Alexander的技巧,并在反向命令之间用分隔符包围文本,以便'hello hello^bye bye'变为'"hello hello"^"bye bye"'。如果你确实选择了这条道路并且它适合你,请接受亚历山大的答案,而不是我的答案,他还提供了实施它的代码。

不使用StrictDelimiter两种解决方法都有局限性:第一需要一些未使用的字符,第二个要求在原文中没有倒逗号和空格。

也许是时候升级到德尔福的新版本:)

+0

无赖!任何解决方法的起点? – Acron 2009-08-26 14:48:02

+1

你想解决什么问题?看起来像我的解决方案。 – jpfollenius 2009-08-26 14:51:49

+5

我有德尔福7,所以这不适合我。 – Acron 2009-08-26 15:00:43

18
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"'; 
+2

废话,你打我,我打字完全一样的答案:) – 2009-08-26 16:01:06

+0

非常聪明,谢谢亚历山大,以及The_Fox,即使你diddn't直接帮助我,但你打算这样做:) – Acron 2009-08-26 21:35:44

+3

+1非常不错,但是如果原始字符串包含一个像''“'这样的子部分,就会出现问题(即文本中引号和空格) – 2009-08-27 05:12:06

2
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]); 
+1

您应该添加一个解释这是干什么的。 – FDinoff 2013-05-22 15:51:17

2

工作的德尔福7 “像手套” 对我来说。这是我申请亚历山大的技巧后的功能:

procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ; 
begin 
    Assert(Assigned(Strings)) ; 
    Strings.Clear; 
    Strings.Delimiter := Delimiter; 
    Strings.DelimitedText := '"' + StringReplace(Input, Delimiter, '"' + Delimiter + '"', [rfReplaceAll]) + '"' ; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Edit1.Text := 'Users^foo bar^bar foo^foobar^barfoo'; 
    Split('^',Edit1.Text,Memo1.Lines); 
end; 

非常感谢!

+0

这是一个解决方法,不是一个办法。 – Paul 2014-02-22 19:07:22