Delphi (2006): 如何按新行拆分并同时中断

Delphi (2006): how to Split by new line and break at the same time

我在 Java 中有这个简单的操作,其中字符串被换行和分隔符分割。

String i= "Holidays 
    
           Great. 
           Bye";
String []linesArray = i.split("\r?\n");

我想在 Delphi 2006 年获得相同的结果。

使用以下步骤有效吗?

charArray[0] := '\r';
charArray[1] := '\n';

strArray     := strA.Split(charArray);

我这样解释你的请求:“在 CR 和 LF 处拆分一个字符串。”这意味着 CR+LF 给出了一个空字符串元素。例如,'alpha'#13'beta'#10'gamma'#13#10'delta' 产生五个元素 'alpha''beta''gamma''''delta'

如果是这样,如果你使用的是非古代版本Delphi,这就很简单了:

var S := 'alpha'#13'beta'#10'gamma'#13#10'delta';

var Parts := S.Split([#13, #10]);
for var Part in Parts do
  ShowMessage(Part);

旧 Delphi 版本

上面的代码需要 TStringHelper(至关重要)并且还使用了内联变量声明、for in 循环和泛型。

对于旧的 Delphi 版本,您可以手动完成:

type
  TStringArray = array of string;

function Split(const S: string): TStringArray;
var
  Count: Integer;
const
  Delta = 512;

  procedure Add(const Part: string);
  begin
    if Length(Result) = Count then
      SetLength(Result, Length(Result) + Delta);
    Result[Count] := Part;
    Inc(Count);
  end;

var
  p, i: Integer;

begin

  Result := nil;
  Count := 0;

  p := 0; // previous delim
  for i := 1 to Length(S) do
    if S[i] in [#13, #10] then
    begin
      Add(Copy(S, Succ(p), i - p - 1));
      p := i;
    end;

  Add(Copy(S, Succ(p)));

  SetLength(Result, Count);

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  S: string;
  Parts: TStringArray;
  i: Integer;
begin

  S := 'alpha'#13'beta'#10'gamma'#13#10'delta';

  Parts := Split(S);
  for i := 0 to High(Parts) do
    ShowMessage(Parts[i]);

end;