Delphi 从字符串中删除符号
Delphi remove symbols from String
我已经搜索并尝试了几个循环,它们应该从字符串中删除符号,我需要这个,因为某些位置可以有“/”或其他类型的符号,我需要它被删除,因为 FTP 会认为这是一个文件夹,我需要名称中的字符串。
字符串 'place' 因人当前工作地点而异,例如有一个 'place' = "S/A StorageRoom",字符串的 '/' 部分使 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 Berlin
你感冒了就用
这样的函数吧
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]);
为了避免不必要的堆分配,这是@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;
我已经搜索并尝试了几个循环,它们应该从字符串中删除符号,我需要这个,因为某些位置可以有“/”或其他类型的符号,我需要它被删除,因为 FTP 会认为这是一个文件夹,我需要名称中的字符串。
字符串 'place' 因人当前工作地点而异,例如有一个 'place' = "S/A StorageRoom",字符串的 '/' 部分使 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 Berlin
你感冒了就用
这样的函数吧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]);
为了避免不必要的堆分配,这是@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;