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

Acr*_*ron 54 delphi tstringlist delphi-7 delimiter

我在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;
Run Code Online (Sandbox Code Playgroud)

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

sl[1] 回来了 'foo'

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

有任何想法吗?

Roe*_*ler 84

你应该设置s1.StrictDelimiter := True空格不被认为是分隔符,这里有更多信息.

由于您使用的是不支持上述内容的版本(在提交答案后已明确说明),因此您有两种选择:

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

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

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

  • 我有Delphi 7,所以这对我不起作用. (5认同)
  • 您的出发点是在Classes.pas中读取SetDelimitedText的源代码,并在子类TStrings中创建一个以您需要的方式处理它的版本,或者只是编写一个独立的函数来在插入符号上拆分字符串并返回一个字符串列表. (4认同)
  • 你可以暂时把空间变成别的东西,然后再改回来吗?通常不会出现在列表中的任何其他字符都可以使用.这是一个黑客,或者我们更喜欢'必要的邪恶作为解决方法'.:-) (3认同)

Ale*_*lex 18

sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
Run Code Online (Sandbox Code Playgroud)

  • +1非常好,但是如果原始字符串包含像"""这样的子部分(即文本中的引号和空格中的空格),则会出现问题 (3认同)
  • 废话,你打败了我,我输入完全相同的答案:) (2认同)

小智 6

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

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

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