如何从字符串中删除重复的空格

时间:2016-02-02 16:17:27

标签: string delphi

我需要从字符串中删除重复的空格。 从互联网上抓取的以下代码可以正常工作,除了它复制了字符串的第一个字符串。 也许还有更快的东西。

function DeleteRepeatedSpaces(OldText: string): string;
var
  i: integer;
  s: string;
begin
   if length(OldText) > 0 then
    s := OldText[1]
  else
    s := '';

  for i := 1 to length(OldText) do
  begin
    if OldText[i] = ' ' then
    begin
      if not (OldText[i - 1] = ' ') then
        s := s + ' ';
    end
    else
    begin
      s := s + OldText[i];
    end;
  end;

  DelDoubleSpaces := s;
end;

4 个答案:

答案 0 :(得分:5)

基于最简单的状态机(DFA)的功能。内存重新分配的最小值 State是连续空格的数量 J是已删除空格的计数。

  function DeleteRepeatedSpaces(const s: string): string;
  var
    i, j, State: Integer;
  begin
    SetLength(Result, Length(s));
    j := 0;
    State := 0;

    for i := 1 to Length(s) do begin

      if s[i] = ' ' then
        Inc(State)
      else
        State := 0;

      if State < 2 then
        Result[i - j] := s[i]
      else
        Inc(j);

    end;

    if j > 0 then
        SetLength(Result, Length(s) - j);
  end;

答案 1 :(得分:3)

迭代字符串的所有成员,将字符移动到Result,但跳过重复的空格。

function DeleteRepeatedSpaces(const OldText: string): string;
var
  i,j,hi: Integer;
begin
  SetLength(Result,Length(OldText));
  i := Low(OldText);
  j := i;
  hi := High(OldText);
  while (i <= hi) do begin
    Result[j] := OldText[i];
    Inc(j);
    if (OldText[i] = ' ') then begin
      repeat  //Skip additional spaces
        Inc(i);
      until (i > hi) or (OldText[i] <> ' ');
    end
    else
      Inc(i);
  end;
  SetLength(Result,j-Low(Result));  // Set correct length
end;

以上代码相当快(到目前为止比任何其他贡献都快)。

以下是一个更优化的例程:

function DeleteRepeatedSpaces(const OldText: string): string;
var
  pO,pR: PChar;
begin
  SetLength(Result,Length(OldText));
  pR := Pointer(Result);
  pO := Pointer(OldText);
  while (pO^ <> '') do begin
    pR^ := pO^;
    Inc(pR);
    if (pO^ <> ' ') then begin
      Inc(pO);
      Continue;
    end;
    repeat // Skip additional spaces
      Inc(pO);
    until (pO^ = '') or (pO^ <> ' ');
  end;
  SetLength(Result,pR-Pointer(Result));
end;

答案 2 :(得分:2)

以下不是非常有效,但可能更多,以便逐个字符处理字符串,因为它不需要为输出中的每个字符分配新的字符串:

function RemoveDupSpaces(const Input : String) : String;
var
  P : Integer;
begin
  Result := Input;
  repeat
    P := Pos('  ', Result);  // that's two spaces
    if P > 0 then
      Delete(Result, P + 1, 1);
  until P = 0;
end;

答案 3 :(得分:-1)

您可以使用以下内容:

function DeleteRepeatedSpaces(const s: string):string;
var
  i:integer;
begin
  Result := '';
  for i := 1 to Length(S) do begin
    if not ((s[i]=' ') and (s[i-1]=' ')) then begin
      Result := Result + s[i];
    end;
  end;
end;

删除字符串中连续两个以上的空格。

此字符串(不含空格):

The string have groups of spaces inside

返回:

The string have groups of spaces inside

此字符串(内部有空格组):

The   string  have       groups    of  spaces   inside

返回:

The string have groups of spaces inside