首页 > 解决方案 > Delphi(2006):如何按换行符拆分并同时中断

问题描述

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

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

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

使用以下步骤是否有效?

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

strArray     := strA.Split(charArray);

标签: delphisplitnewlineline-breaksdelphi-2006

解决方案


我这样解释您的请求:“在 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;

推荐阅读