2010-08-21 17 views
7

Estoy buscando la mejor manera de comprobar que un NSString contiene caracteres numéricos y alfabéticos. Lo que he encontrado hasta ahora es el siguiente código, pero esto me dice que no se ingresaron caracteres que no sean números o letras.Comprobar NSString contiene letras y números

if([[myNSString stringByTrimmingCharactersInSet: 
      [NSCharacterSet alphanumericCharacterSet]] isEqualToString:@""]){  
    //The string only contains alpha or numerical characters. 
    //But now I want to check that both character sets are present ?  
} 
+0

Sé que es una herejía decir esto, pero la forma más simple, más comprensible y más eficiente de hacer esto es casi con certeza simplemente recorrer la cadena, extraer cada carácter con 'characterAtIndex' y probarlo con los límites apropiados . Con los demás, será mejor que tengas algunos buenos comentarios si quieres entender el código dentro de 6 meses. –

Respuesta

14

Sólo recortar letterCharacterSet y decimalDigitCharacterSet y comprobar si la cadena producida no es igual a la cadena original:

if (![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]] isEqualToString:myOriginalString] 
    && ![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]] isEqualToString:myOriginalString]) { 
... 
} 
+0

Gracias. Sí, esto es lo que terminé haciendo al final. – ADude

+0

¡qué cosas tan geniales! – jianpx

+0

detectar un error: si la cadena contiene el carácter de control, devuelve SÍ, eso está mal. – jianpx

5

respuesta kovpas' funciona bien si tiene letras al principio o al final y dígitos en la extremo opuesto. Se produce un problema si los dígitos están incrustados entre letras o viceversa, como 'abc123abc'. Aquí es una solución:

if (![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str] 
    && ![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str]) { 
    .... 
} 
+0

¡esta respuesta funciona mucho mejor! Sin embargo, no estoy seguro de por qué estás usando 'invertedSet'. Gracias – Ezeki

+0

El truco para este problema es que es más complicado verificar una afirmación. El primer cheque construye una cadena sin dígitos; si la cadena es idéntica a la original, entonces no hay dígitos en la cadena. Se realiza un control similar con el segundo cheque de letras. Esta es la razón por la cual NO hay para las 2 condiciones. – Amory

+0

sí, pero no es necesario usar 'invertedSet', funciona perfectamente incluso sin – Ezeki

4

No estoy seguro de las dos respuestas anteriores cubren los requisitos, por lo que esta es una respuesta que corresponde a una interpretación más estricta de los requisitos.

Tomando los requisitos de los comentarios en el código del post original:

//The string only contains alpha or numerical characters. 
//But now I want to check that both character sets are present? 

Esto significa que una cadena para pasar la prueba debe consistir sólo números y letras, y al menos uno de cada uno.

NSStringrangeOfCharacterFromSet: encuentra un carácter en una cadena si pertenece a un conjunto determinado, por lo que podemos usar ese.

NSString *string = // ... string to test; 

NSCharacterSet *illegalChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 

// Test if there is an illegal character in the string 
BOOL hasIllegalCharacter = [string rangeOfCharacterFromSet: illegalCharacterSet].location != NSNotFound; 

BOOL hasLetter = [string rangeOfCharacterFromSet: [NSCharacterSet letterCharacterSet]].location != NSNotFound; 

BOOL hasDigit = [string rangeOfCharacterFromSet: [NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound; 

if (hasDigit && hasLetter && !hasIllegalCharacter ) { 
    // String OK 
} 

como se detalla en la documentación, el rangeOfCharacterFromSet: devuelve un NSRange de {NSNotFound, 0} en caso de que ningún personaje de la serie se encuentra en la cadena. Esto es similar a otros métodos para buscar cadenas o caracteres en una cadena en Cocoa.

+0

fácil de comprender – jianpx

Cuestiones relacionadas