【问题标题】:Parsing Text with StringList: \n vs #13#10 vs sLineBreak使用 StringList 解析文本:\n vs #13#10 vs sLineBreak
【发布时间】:2021-02-14 17:55:45
【问题描述】:

我正在尝试使用 TStringList 解析字符串:

  sl:=TStringList.Create;
  try
    sl.Text:=aString;
    FFirstRow:=sl[0];
    FSecondRow:=sl[1];
  finally
    sl.Free;
  end;

如果aString:='aa'+#13#10+'bb'aString:='aa'+sLineBreak+'bb'FFirstRowaaFSecondRowbb。但是如果 aString:='aa\nbb'then FFirstRow 得到整个字符串(并且没有第二行)。如何解析以\n为分隔符的字符串?

我试过sl.Delimiter:=Char(13)(和sl.DelimitedText:=aString)。

【问题讨论】:

  • 因为.Delimiter 是一个字符而不是字符串(\n 是两个字符),所以你不能。但是,是什么阻止您将所有出现的 \n 替换为 #13#10 之前?
  • 此问题与stackoverflow.com/questions/15424293/… 相似,具有相同的有效答案。

标签: delphi tstringlist


【解决方案1】:

您可以只更改TStringList 中被视为换行符的字符串:

  sl := TStringList.Create;
  try
    sl.LineBreak := '\n';
    sl.Text := aString;
    FFirstRow := sl[0];
    FSecondRow := sl[1];
  finally
    sl.Free;
  end;

【讨论】:

  • 聪明而简单。我永远不会想到这一点(或者以一种会提出你之前答案的方式搜索 SO)。
【解决方案2】:

2 字符序列'\'+'n' 在 Delphi 中不被视为转义序列(仅在 C/C++ 中,仅在编译时文字中,而不在运行时数据中)。您将不得不手动替换序列,例如使用StringReplace(),例如:

aString := 'aa\nbb';
sl := TStringList.Create;
try
  sl.Text := StringReplace(aString, '\n', #10, [rfReplaceAll]);
  FFirstRow := sl[0];
  FSecondRow := sl[1];
finally
  sl.Free;
end;

【讨论】:

  • 谢谢,雷米。这样可行! (我认为标志是 rfReplaceAll,至少在 Delphi 10.3 中。)
  • @AlC 是的,是的。那只是一个错字,我已经改正了。
猜你喜欢
  • 2012-02-12
  • 2014-02-17
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多