Если я вас правильно понимаю, вы можете использовать такую функцию:
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;
и поэтому я обычно не использую ^.
Кстати, у кого-нибудь есть идея, как отформатировать это так, чтобы подсветка работала правильно?