Разбор текста с помощью StringList: \n против #13#10 против sLineBreak

Я пытаюсь разобрать строку с помощью 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', то FFirstRow равно aa, а FSecondRow равно bb. Но если aString:='aa\nbb', то FFirstRow получает всю строку (и второй строки нет). Как разобрать строку с \n в качестве разделителя?

Я пробовал sl.Delimiter:=Char(13)sl.DelimitedText:=aString).


person Al C    schedule 14.02.2021    source источник
comment
Поскольку .Delimiter — это один символ, а не строка (\n — это два символа), вы не можете. Но что удерживает вас от замены всех вхождений \n на #13#10 раньше?   -  person AmigoJack    schedule 14.02.2021
comment
Этот вопрос похож на stackoverflow.com/questions/15424293/ с тем же допустимым ответом.   -  person Uwe Raabe    schedule 15.02.2021


Ответы (2)


Вы можете просто изменить строку, которая обрабатывается как разрыв строки в TStringList:

  sl := TStringList.Create;
  try
    sl.LineBreak := '\n';
    sl.Text := aString;
    FFirstRow := sl[0];
    FSecondRow := sl[1];
  finally
    sl.Free;
  end;
person Uwe Raabe    schedule 14.02.2021
comment
Умный, но простой. Я никогда бы не подумал об этом (или искал SO таким образом, который привел бы к вашему предыдущему ответу). - person Al C; 15.02.2021

Двухсимвольная последовательность '\'+'n' не рассматривается как escape-последовательность в 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;
person Remy Lebeau    schedule 14.02.2021
comment
Спасибо, Реми. Это работает! (Я думаю, что флаг rfReplaceAll, по крайней мере, в Delphi 10.3.) - person Al C; 14.02.2021
comment
@AlC да, это так. Это была просто опечатка, я ее исправил. - person Remy Lebeau; 14.02.2021