¿Cuál es la forma más rápida de eliminar caracteres no alfanuméricos de una cadena en Delphi7?


5

Los caracteres permitidos son de la A a la Z, de la a a la z, de 0 a 9. La menor cantidad de código o una sola función sería mejor ya que el sistema es crítico en el tiempo en la respuesta a la entrada.

+2

Niza etiquetado allí;) 22 feb. 092009-02-22 09:24:20

8
uses JclStrings; 

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

Nota: En la última biblioteca de JCL, diría: 'usa JclAnsiStrings' 27 jun. 122012-06-27 12:57:44


1

caso onkeypress

comienzan si no (clave en [ 'a' .. 'Z', 'a' .. 'z', '0' .. '9']), entonces clave: = # 0; final;

  0

Usted tiene que validar el texto antes de utilizar de todos modos. Puede omitir este control utilizando el portapapeles o texto arrastrando y soltando. 22 feb. 092009-02-22 10:23:11

  0

El OP quiere quitar una cadena, sin mencionar el teclado. 22 feb. 092009-02-22 11:42:00


3

Solo para añadir una observación.

La solución que usa un conjunto está bien en Delphi 7, pero puede causar algunos problemas en Delphi 2009 porque los conjuntos no pueden ser de char (se convierten a ansichar).

Una solución que puede utilizar es:

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

Pero la forma más versátil es por supuesto:

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

En ese caso se puede utilizar ValidChar en varias ubicaciones y si necesita estar cambiado, solo tiene que cambiarlo una vez.


10

Si he entendido bien se puede utilizar una función como esta:

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; 

Esto utilizará PChar de alta velocidad (a costa de menos legibilidad).

Editar: Re el comentario de gabr sobre el uso de DestPtr [0] en lugar de DestPtr^: Esto debe compilar a los mismos bytes de todos modos, pero hay buenas aplicaciones en código similar, donde es necesario mirar hacia el futuro. Supongamos que desea reemplazar las líneas nuevas, entonces podría hacer algo como

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; 

y por lo tanto no suelo utilizar el ^.

BTW, ¿alguien tiene una idea de cómo formatear esto de forma que el resaltado funcione correctamente?

  0

Encuentro el uso de SrcPtr [0] aquí muy interesante, nunca antes había visto tal enfoque. Una forma más canónica sería usar SrcPtr^y DestPtr ^. 22 feb. 092009-02-22 11:26:38

  0

Re: Formateo - tal vez si se pone el punto y coma que falta después de "DestPtr [0]: = 't'" el resaltado funcionaría. :-) 22 feb. 092009-02-22 14:43:04

  0

Gracias Ken, corregido, pero todavía no está funcionando :-(El resaltador trata las cadenas de Delphi como cadenas de C desafortunadamente. 22 feb. 092009-02-22 15:56:44

  0

@mghie: RE Edit: Eso es realmente un enfoque ordenado y algo en lo que nunca pensé. Gracias por la gran idea! 22 feb. 092009-02-22 18:33:31

  0

Creo que quiere decir 'mientras SrcPtr^<> # 0' o' mientras SrcPtr [0] <> # 0'. 27 jun. 122012-06-27 12:59:43

  0

Tenga en cuenta que las cadenas de Delphi pueden contener caracteres nulos. El resultado de llamar 'S: = ' Una cadena con un carácter nulo '# 0'! '; T: = StripNonAlphaNumeric (S); 'terminará con un' l'. 27 jun. 122012-06-27 13:02:48