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

时间:2009-02-22 08:55:32

标签: delphi delphi-7

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

4 个答案:

答案 0 :(得分: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;

这将使用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;

因此我通常不使用^。

BTW,是否有人知道如何以突出显示正常工作的方式对其进行格式化?

答案 1 :(得分:9)

uses JclStrings;

  S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);

答案 2 :(得分:3)

只是添加一个评论。

使用集合的解决方案在Delphi 7中很好,但它可能会在Delphi 2009中引起一些问题,因为集合不能是char(它们被转换为ansichar)。

您可以使用的解决方案是:

case key of 
  'A'..'Z', 'a'..'z', '0'..'9' : begin end; // No action
else
  Key := #0;
end;

但最通用的方式当然是:

if not ValidChar(key) then
  Key := #0;

在这种情况下,您可以在多个位置使用ValidChar,如果需要更改,您只需更改一次。

答案 3 :(得分:1)

OnKeypress事件

开始   如果没有(键入['A'..'Z','a'..'z','0'..'9'])然后     键:=#0; 端;