I caratteri consentiti sono dalla A alla Z, dalla a alla z, da 0 a 9. La quantità minima di codice o una singola funzione sarebbe la migliore in quanto il sistema è critico in termini di tempo per la risposta all'input.Qual è il modo più veloce di rimuovere caratteri non alfanumerici da una stringa in Delphi7?
risposta
uses JclStrings;
S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);
Nota: nell'ultima libreria JCL, si direbbe: 'utilizza JclAnsiStrings'. –
evento onkeypress
iniziano se non (tasto in [ 'A' .. 'Z', 'a' .. 'z', '0' .. '9']) allora chiave: = # 0; fine;
È necessario convalidare il testo prima di utilizzare comunque. Puoi ignorare questo controllo usando gli appunti o il trascinamento del testo. – DiGi
L'OP vuole togliere una stringa - nessuna menzione della tastiera. –
Solo per aggiungere un commento.
La soluzione che utilizza un set va bene in Delphi 7, ma può causare alcuni problemi in Delphi 2009 perché gli insiemi non possono essere di carattere (vengono convertiti in ansichar).
Una soluzione è possibile utilizzare è:
case key of
'A'..'Z', 'a'..'z', '0'..'9' : begin end; // No action
else
Key := #0;
end;
Ma il modo più versatile è ovviamente:
if not ValidChar(key) then
Key := #0;
In questo caso è possibile utilizzare ValidChar in più località e se ha bisogno di essere cambiato devi solo cambiarlo una volta.
Se ho capito bene si potrebbe usare una funzione come questa:
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;
Questo userà PChar per la massima velocità (al costo di meno leggibilità).
Edit: Re il commento di Gabr sull'utilizzo DestPtr [0] invece di DestPtr^: Questo dovrebbe compilare alle stesse byte in ogni caso, ma ci sono belle applicazioni in codice simile, in cui è necessario guarda avanti. Supponiamo che vogliate sostituire le nuove linee, quindi potreste fare qualcosa come
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;
e quindi di solito non uso il ^.
BTW, qualcuno ha un'idea di come formattare questo in modo che l'evidenziazione funzioni correttamente?
Trovo che l'uso di SrcPtr [0] qui sia molto interessante - non ho mai visto un simile approccio prima. Più modo canonico sarebbe usare SrcPtr^e DestPtr ^. – gabr
Ri: Formattazione - forse se si inserisce il punto e virgola mancante dopo "DestPtr [0]: = 't'" l'evidenziazione funzionerebbe. :-) –
Grazie Ken, corretto, ma non funziona ancora :-(L'evidenziatore tratta le stringhe Delphi come stringhe C. Sfortunatamente – mghie
Nice tagging there;) – AdrianoKF