在 Delphi 7 中从字符串中去除非字母数字字符的最快方法是什么?

2024-02-23

允许的字符为 A 到 Z、a 到 z、0 到 9。代码量最少或单个函数最好,因为系统对输入响应的时间要求严格。


如果我理解正确的话,你可以使用这样的函数:

function StripNonAlphaNumeric(const AValue: string): string;
var
  SrcPtr, DestPtr: PChar;
begin
  SrcPtr := PChar(AValue);
  SetLength(Result, Length(AValue));
  DestPtr := PChar(Result);
  while SrcPtr[0] <> #0 do begin
    if SrcPtr[0] in ['a'..'z', 'A'..'Z', '0'..'9'] then begin
      DestPtr[0] := SrcPtr[0];
      Inc(DestPtr);
    end;
    Inc(SrcPtr);
  end;
  SetLength(Result, DestPtr - PChar(Result));
end;

这将使用PChar以获得最高速度(以可读性较低为代价)。

Edit:回复 gabr 关于使用的评论DestPtr[0]代替DestPtr^:无论如何,这应该编译为相同的字节,但是类似代码中有很好的应用程序,您需要向前看。假设你想替换换行符,那么你可以这样做

function ReplaceNewlines(const AValue: string): string;
var
  SrcPtr, DestPtr: PChar;
begin
  SrcPtr := PChar(AValue);
  SetLength(Result, Length(AValue));
  DestPtr := PChar(Result);
  while SrcPtr[0] <> #0 do begin
    if (SrcPtr[0] = #13) and (SrcPtr[1] = #10) then begin
      DestPtr[0] := '\';
      DestPtr[1] := 't';
      Inc(SrcPtr);
      Inc(DestPtr);
    end else
      DestPtr[0] := SrcPtr[0];
    Inc(SrcPtr);
    Inc(DestPtr);
  end;
  SetLength(Result, DestPtr - PChar(Result));
end;

因此我通常不使用^.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Delphi 7 中从字符串中去除非字母数字字符的最快方法是什么? 的相关文章

随机推荐