Delphi从字符串中删除符号

时间:2019-02-06 13:55:43

标签: delphi delphi-10.1-berlin

我已经搜索并尝试了一些应该从字符串中删除符号的循环,我需要这样做,因为某些位置可以带有“ /”或其他类型的符号,并且我需要将其删除,因为FTP会认为这是一个文件夹,我需要一个字符串作为名称。

字符串'place'不同于当前人员的工作位置,例如,有一个'place'=“ S / A StorageRoom”,字符串make的FTP的'/'部分认为它是子文件夹。

现在我正在使用它,我认为它很大,可以使用'shortening':

   place := StringReplace(place, ',', '', [rfReplaceAll]);
   place := StringReplace(place, '.', '', [rfReplaceAll]);
   place := StringReplace(place, '/', '', [rfReplaceAll]);
   place := StringReplace(place, '!', '', [rfReplaceAll]);
   place := StringReplace(place, '@', '', [rfReplaceAll]);
   place := StringReplace(place, '#', '', [rfReplaceAll]);
   place := StringReplace(place, '$', '', [rfReplaceAll]);
   place := StringReplace(place, '%', '', [rfReplaceAll]);
   place := StringReplace(place, '^', '', [rfReplaceAll]);
   place := StringReplace(place, '&', '', [rfReplaceAll]);
   place := StringReplace(place, '*', '', [rfReplaceAll]);
   place := StringReplace(place, '''', '', [rfReplaceAll]);
   place := StringReplace(place, '"', '', [rfReplaceAll]);
   place := StringReplace(place, ';', '', [rfReplaceAll]);
   place := StringReplace(place, '_', '', [rfReplaceAll]);
   place := StringReplace(place, '(', '', [rfReplaceAll]);
   place := StringReplace(place, ')', '', [rfReplaceAll]);
   place := StringReplace(place, ':', '', [rfReplaceAll]);
   place := StringReplace(place, '|', '', [rfReplaceAll]);
   place := StringReplace(place, '[', '', [rfReplaceAll]);
   place := StringReplace(place, ']', '', [rfReplaceAll]);
   place := StringReplace(place, '\', '', [rfReplaceAll]);

编辑: 我目前正在使用RAD Studio 10.1柏林

2 个答案:

答案 0 :(得分:3)

为避免不必要的堆分配,这是@Ancaron答案的一种变体,它仅进行一次分配并最终减小大小以产生答案。

技巧是在开始时预先分配结果字符串,然后用可接受的字符填充它。 最后,调整结果字符串的长度。

program TestStripChars;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function StripChars (const Text : string; const InValidChars : SysUtils.TSysCharSet) : string;
var
  i,j : Integer;
begin
  SetLength(Result,Length(Text));  // Preallocate result maximum length
  j := 0;  // Resulting string length counter
  for i := 1 to Length(Text) do begin
    if not CharInSet(Text[i],InValidChars) then begin
      Inc(j);
      Result[j] := Text[i];
    end;
  end;
  SetLength(Result,j); // Set result actual length
end;

var
  place : String;
begin
  place := 'Hell$$o D.,e.$lphi';
  place := StripChars(place,[',','.','$']);
  WriteLn(place);
  ReadLn;
end.

从注释中看,OP似乎正在使用具有从零开始的字符串处理的编译器设置。

这是处理两种情况的函数:

function StripChars ( const Text : string; const InValidChars : SysUtils.TSysCharSet) : string;
var
  i,j,zbsAdj : Integer;
begin
  SetLength(Result,Length(Text));  // Preallocate result maximum length
  j := 0; // Resulting string length counter
  zbsAdj := 1-Low(String); // Handles zero based string offset
  for i := Low(Text) to High(Text) do begin
    if not CharInSet(Text[i],InValidChars) then begin
      Inc(j);
      Result[j-zbsAdj] := Text[i];
    end;
  end;
  SetLength(Result,j); // Set result actual length
end;

答案 1 :(得分:0)

您只是使用

之类的功能
function StripChars ( const Text : string; InValidChars : TSetOfChar ) : string;
var
  S : string;
  i : integer;
begin
  Result := '';
  if Length(Text) > 0 then
  begin
    S := '';
    for i := 1 to length ( Text ) do
      if not CharInSet(Text[i],InValidChars) then  
        S := S + Text [ i ];
    Result := S;
  end;
end;

然后仅致电

place := StripChars(place,[',','.', and so on]);