我有在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'
看来,分隔符现在是'^'
和' '
有任何想法吗?
你应该设置s1.StrictDelimiter := True
的空间不被认为是分隔符,更多信息在这里 。
既然你在不支持以上(作为答案提交后澄清)版本的工作,你有两个选择:
- 找到你知道一个字符将不会在原文中使用(例如,下划线),所有空格分割之前转换为字符,并分割后转换回。 这是ROBOSOFT的建议。
- 如果你没有在文本倒逗号和空格,您可以用亚历山大的把戏,敷分隔符的文本中倒命令,让
'hello hello^bye bye'
变成'"hello hello"^"bye bye"'
。 如果你选择了这条路,它适合你,请接受亚历山大的答案,不是我的,他还提供了实现它的代码。
不使用这两种解决方法StrictDelimiter
有局限性:第一需要一些未使用的字符,第二个要求在原文中没有倒逗号和空格。
也许是时候升级到德尔福的新版本:)
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
莱恩具有提供商使用ExtractStrings这一问题的最佳解决方案(在Delphi)函数。 看到:
解析使用分隔符来一个的TStringList字符串,似乎也对解析空间(德尔福)
所以你的情况,与线下更换到sl.Delimiter和sl.DelimitedText电话:ExtractStrings([ '^'],[],PChar类型(S),SL);
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
工作在德尔福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;
非常感谢!
文章来源: Delphi: StringList Delimiter is always a space character even if Delimiter is set