Delphi:即使设置了分隔符,StringList分隔符也始终是空格字符

我遇到了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 ' '

有任何想法吗?

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

由于您的版本不支持上述版本(答案提交后已澄清),因此您有两种select:

  1. find一个你知道不会在原文中使用的字符(例如下划线),在分割之前将所有空格转换为该字符,并在分割之后转换回来。 这是robosoft的build议。
  2. 如果在文本中没有引号和空格,你可以使用Alexander的诀窍,并用反命令在分隔符之间包裹文本,这样'hello hello^bye bye'变成'"hello hello"^"bye bye"' 。 如果你确实select了这个方法,并且适合你,请接受亚历山大的答案,而不是我的,他也提供了实现它的代码。

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

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

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

Ryan使用Delphi中的ExtractStrings()函数提供了一个很好的解决scheme。 看到:

使用分隔符parsingstring到TStringList似乎也parsing空格(delphi)

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

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

delphi7的工作“像手套”对我来说。 这是我应用亚历山大的魔术后的function:

 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; 

非常感谢!

Interesting Posts