2011-03-02 21 views
7

Tengo una cadena, vamos a llamarlo MyStr. Estoy tratando de deshacerme de cada carácter no alfabético en la cadena. Al igual que en IM como MSN y Skype, las personas ponen sus nombres para mostrar como [-Bobby-]. Me gustaría eliminar todo en esa cadena que no sea un carácter alfabético, así que todo lo que me queda es el "nombre".Compruebe si MyString [1] es un carácter alfabético?

¿Cómo puedo hacer eso en Delphi? Estaba pensando en crear un TStringlist y almacenar cada carácter válido allí, y luego usar IndexOf para verificar si el char es válido, pero esperaba una manera más fácil.

+2

'suena TStringList' ** ** muy ineficiente ... –

+0

@ Jeff - Qué se necesita para manejar casi ANSI cadenas (caracteres en inglés) o caracteres Unicode? –

+1

@Ken - Necesito caracteres como "æ ø å" también. – Jeff

Respuesta

15

El enfoque más simple es

function GetAlphaSubstr(const Str: string): string; 
const 
    ALPHA_CHARS = ['a'..'z', 'A'..'Z']; 
var 
    ActualLength: integer; 
    i: Integer; 
begin 
    SetLength(result, length(Str)); 
    ActualLength := 0; 
    for i := 1 to length(Str) do 
    if Str[i] in ALPHA_CHARS then 
    begin 
     inc(ActualLength); 
     result[ActualLength] := Str[i]; 
    end; 
    SetLength(Result, ActualLength); 
end; 

pero esto sólo tendrá en cuenta las letras inglesas como "caracteres alfabéticos". ¡Ni siquiera considerará las extremadamente importantes letras suecas Å, Ä y Ö como "caracteres alfabéticos"!

un poco más sofisticado es

function GetAlphaSubstr2(const Str: string): string; 
var 
    ActualLength: integer; 
    i: Integer; 
begin 
    SetLength(result, length(Str)); 
    ActualLength := 0; 
    for i := 1 to length(Str) do 
    if Character.IsLetter(Str[i]) then 
    begin 
     inc(ActualLength); 
     result[ActualLength] := Str[i]; 
    end; 
    SetLength(Result, ActualLength); 
end; 
+0

@Andreas - +1! ¿Es posible incluir el Æ Ø Å y esos también? ¡Gracias! – Jeff

+2

En el primer enfoque, puede simplemente agregarlos al conjunto (''Æ', 'Ø', 'Å', 'Ä', 'Ö', 'å', 'ä', 'ö''). El último enfoque, usando 'IsLetter', incluirá automáticamente todas las letras de todos los idiomas. –

+0

@Jeff GetAlphaSubstr2 hace exactamente eso –

5

prueba este código para comprobar si un carácter es alfabético.

MyStr:='[-Bobby-]'; 
    //is an alphabetical character ? 
    if MyStr[1] in ['a'..'z','A'..'Z'] then 

para eliminar de una cadena todos los caracteres no alfabéticos (caracteres en inglés) puede usar algo como esto.

NewStr:=''; 
for i := 1 to Length(MyStr) do 
if MyStr[i] in ['a'..'z','A'..'Z'] then 
    NewStr:=NewStr+MyStr[i]; 

ahora la variable NewStr contiene solamente caracteres alfabéticos.

en las versiones más nuevas de Delphi puede usar la función Character.IsLetter.

+0

Corto y simple, +1! – Jeff

+0

¿Qué pasa con una versión dependiente de la configuración regional que cubre el resto de los caracteres alfabéticos fuera del rango A..Z? –

+3

@jeroen, la respuesta dice '...para eliminar de una cadena todos los caracteres no alfabéticos (caracteres en inglés) 'para cubrir el resto de los caracteres alfabéticos, el OP puede usar la función' Character.IsLetter' o simplemente expandir el conjunto con los caracteres adicionales como andreas explicar en los comentarios. – RRUZ

2

que tienen toda una serie de rutinas de cuerda optimizadas para hacer estas cosas, que funciona tanto con Unicode y no Unicode Delphi. Los dos más importantes son:

function CsiRemoveArgs(const pInStr: string; const pArgs: string; 
         pRestrictToArgs: Boolean = False): string; 
function CsiRemoveArgs(const pInStr: string; pArgs: TSysCharSet; 
         pRestrictToArgs: Boolean = False): string; 

Puede descargarlos here.

+0

+1 para rutinas que permiten cubrir el resto de los caracteres alfabéticos fuera del rango A..Z –

-1

solución perfecta:

Result := TRegEx.Replace('Input12231213','[^a-zA-Z]+',''); // Result = 'Input' 

Obras en Delphi XE

http://regexpstudio.com

+0

Incluso en Estados Unidos, la gente debería ser menos ingenua que esto. –

Cuestiones relacionadas