在Delphi7中从字符串中剥离非字母数字字符的最快方法是什么?

Joh*_*ler 5 delphi delphi-7

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

mgh*_*hie 10

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

function StripNonAlphaNumeric(const AValue: string): string;
var
  SrcPtr, DestPtr: PChar;
begin
  SrcPtr := PChar(AValue);
  SetLength(Result, Length(AValue));
  DestPtr := PChar(Result);
  while SrcPtr <> #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;
Run Code Online (Sandbox Code Playgroud)

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

编辑:通过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 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;
Run Code Online (Sandbox Code Playgroud)

因此我通常不使用^.

顺便说一下,有没有人知道如何以突出显示正常工作的方式格式化?

  • 请注意,Delphi 字符串可能包含空字符。调用`S := 'A string with a null '#0' character!' 的结果;T := StripNonAlphaNumeric ( S );` 将以 `l` 结尾。 (2认同)

小智 10

uses JclStrings;

  S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);
Run Code Online (Sandbox Code Playgroud)

  • 注意:在最新的JCL库中,您会说:`使用JclAnsiStrings` (3认同)