允许的字符是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 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;
因此我通常不使用^.
顺便说一下,有没有人知道如何以突出显示正常工作的方式格式化?
uses JclStrings; S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);