我遇到了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'
分隔符现在似乎是'^'
和' '
有什么想法吗?
答案 0 :(得分:82)
您应该将s1.StrictDelimiter := True
设置为不被视为分隔符的空格,更多信息here。
由于您使用的版本不支持上述内容(如答案提交后澄清),您有两种选择:
'hello hello^bye bye'
变为{{1} }}。如果您确实选择了此路径并且它适合您,请接受Alexander的回答而不是我的回答,他还提供了实现它的代码。不使用'"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;
非常感谢!