Delphi:StringList Delimiter始终是空格字符,即使设置了Delimiter也是如此

时间:2009-08-26 14:16:08

标签: delphi delphi-7 delimiter tstringlist

我遇到了TStringList类中的分隔符问题。看看:

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'

分隔符现在似乎是'^'' '

有什么想法吗?

5 个答案:

答案 0 :(得分:82)

您应该将s1.StrictDelimiter := True设置为不被视为分隔符的空格,更多信息here

由于您使用的版本不支持上述内容(如答案提交后澄清),您有两种选择:

  1. 找到您知道不会在原始文本中使用的字符(例如下划线),在拆分之前将所有空格转换为该字符,并在拆分后转换回来。这是robosoft的建议。
  2. 如果文本中没有引号和空格,则可以使用Alexander的技巧,并在反向命令中将分隔符包装在分隔符之间,以便'hello hello^bye bye'变为{{1} }}。如果您确实选择了此路径并且它适合您,请接受Alexander的回答而不是我的回答,他还提供了实现它的代码。
  3. 不使用'"hello hello"^"bye bye"'的两种解决方法都有局限性:第一个需要一些未使用的字符,第二个不需要在原始文本中使用引号和空格。

    也许是时候升级到更新版本的Delphi了:)

答案 1 :(得分:18)

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

答案 2 :(得分:4)

使用Delphi中的ExtractStrings()函数,Ryan为这个问题提供了一个很好的解决方案。参见:

Parsing a string using a delimiter to a TStringList, seems to also parse on spaces (Delphi)

因此,在您的情况下,使用以下行替换对sl.Delimiter和sl.DelimitedText的调用: ExtractStrings([' ^'],[],PChar(S),sl);

答案 3 :(得分:2)

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

答案 4 :(得分:2)

对我来说,在Delphi 7中“像手套一样”。应用Alexander's Trick后,这是我的功能:

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;

非常感谢!