58

我在使用 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'

看来分隔符现在是'^'AND' '

有任何想法吗?

4

5 回答 5

90

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

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

  1. 找到一个你知道不会在原文中使用的字符(例如下划线),在拆分之前将所有空格转换为该字符,并在拆分后转换回来。这是robosoft的建议。
  2. 如果文本中没有倒排逗号和空格,可以使用Alexander的技巧并将文本换行在分隔符之间的倒排命令中,这样就'hello hello^bye bye'变成了'"hello hello"^"bye bye"'. 如果您确实选择了这条路径并且它适合您,请接受 Alexander 的回答而不是我的,他还提供了实现它的代码。

两种不使用的变通方法StrictDelimiter都有限制:第一种需要一些未使用的字符,第二种需要在原始文本中没有引号和空格。

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

于 2009-08-26T14:25:55.300 回答
19
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
于 2009-08-26T15:56:17.130 回答
6

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

使用分隔符将字符串解析为 TStringList,似乎也解析空格(Delphi)

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

于 2013-03-05T13:45:04.267 回答
4

在 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;

非常感谢!

于 2013-10-29T18:55:07.810 回答
2
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
于 2013-05-22T15:31:45.797 回答