我需要使用 Delphi 中的子字符串分隔符解析 TStringStream 中的字符串



Using Delphi XE,我需要将 TStringStream 解析为由字符串分隔的字符串。在一种情况下,分隔符字符串将是 [eol]。流是使用 indy IdHttp 从网络服务器加载的。

然后,我需要从 Stream 中解析字符串,它们由字符串"[eol]"分隔。例如,StringStream可以包含:

"12345[eol]这是]某物[EOL]和[这是什么都没有[eol]etc[etcetc[[eol]">

应解析为:

"12345">

"这是]东西">

"[这没什么">

"等等[等等[">

我知道的大多数分隔符技术只使用单个字符分隔符,然后我还需要遍历整个 Stream 直到其结束。我不知所措,

问候艾利安

由于您已经在使用 Indy,因此您可以使用其 SplitColumnsNoTrim() 函数将String拆分为TStrings,使用可以包含多个字符的分隔符字符串。 顾名思义,SplitColumnsNoTrim() 不会在分隔的子字符串之间应用任何修剪。 如果要修剪,请改用SplitColumns()

var
  Strm: TStringStream;
  Strings: TStringList;
begin
  Strings := TStringList.Create;
  try
    Strm := TStringStream.Create;
    try
      IdHTTP.Get('http://...', Strm);
      SplitColumnsNoTrim(Strm.DataString, Strings, '[eol]'); 
    finally
      Strm.Free;
    end;
    // use Strings as needed ...
  finally
    Strings.Free;
  end;
end;

不过,我不建议使用TStringStream进行这种解析。 D2009+ 中的TStringStream要求您在其构造函数中指定TEncoding(或让它默认为操作系统默认的 Ansi 编码(,如果您必须TIdHTTP直接下载到TStringStream中,则无法执行此操作。您不会提前知道数据的字符集,除非数据始终是 ASCII。 TIdHTTP具有使用数据的实际字符集将下载的数据解码为String的逻辑,因此您应该改用该功能,例如:

var
  Strings: TStringList;
begin
  Strings := TStringList.Create;
  try
    SplitColumnsNoTrim(IdHTTP.Get('http://...'), Strings, '[eol]'); 
    // use Strings as needed ...
  finally
    Strings.Free;
  end;
end;

相关内容

  • 没有找到相关文章

最新更新