我有麻烦分隔在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空间不被认为是分隔符,更多信息的此处

由于您在不支持以上(作为答案提交后澄清)版本的工作,你有两个选择:

  1. 找到你知道一个字符将不会在原文中使用(如下划线),将所有空间,以这个角色分裂之前,和分割后转换回。这是 ROBOSOFT 的建议。
  2. 如果你没有在文本倒逗号和空格,你可以使用的亚历山大伎俩和包装在倒命令分隔符之间的文本,让'hello hello^bye bye'转向'"hello hello"^"bye bye"'。如果你选择了这条路,它适合你,请接受亚历山大的答案,不是我的,他还提供了代码来实现它。
  3. 不使用StrictDelimiter两种解决方法有其局限性:第一需要一些未使用的字符,并且第二要求在原始文本没有引号和空格。

    也许是时候升级到德尔福的新版本:)

其他提示

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

Ryan有提供一个很好的解决这个问题使用ExtractStrings()function在Delphi。参见:

分析一字符串中使用一个分隔一TStringList,似乎也分析关于空间(Delphi)

所以在你的情况下,更换呼叫sl。分隔和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;

非常感谢!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top