2011-09-25 11 views
50

que tengo una cadena que tiene que ser solamente a-z, 0-9 y _Comprobar si NSString contiene alfanumérico + guiones bajos solamente

¿Cómo puedo comprobar si la entrada es válida? He intentado esto, pero acepta carta como A, A, O, O, etc.

NSString *string = [NSString stringWithString:nameField.text]; 
NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; 
[string stringByTrimmingCharactersInSet:alphaSet]; 
[string stringByReplacingOccurrencesOfString:@"_" withString:@""]; 
BOOL valid = [[string stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 

Respuesta

126

Usted puede crear su propio juego de caracteres:

NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"]; 

Una vez que tenga eso, invertirla para todo lo que no está en su cadena original:

s = [s invertedSet]; 

Y a continuación, puede utilizar una cadena método para encontrar si su cadena contiene algo en el conjunto invertido:

NSRange r = [string rangeOfCharacterFromSet:s]; 
if (r.location != NSNotFound) { 
    NSLog(@"the string contains illegal characters"); 
} 
+0

Pero lo que si el usuario quiere añadir en el equivalente de la A a la Z en otro idioma como el chino? – Supertecnoboff

+0

@Supertecnoboff no hay alfabeto en chino. Quizás confundas con Hiragana y Katakana japoneses. O te refieres a los Ideogramas Unificados de CJK, y eso es 80,388 de ellos: https://en.wikipedia.org/wiki/CJK_Unified_Ideographs –

+0

@ Cœur Lo que quiero decir es cómo asegurar que esto compruebe que el usuario ha ingresado números solo en CUALQUIER idioma. Esto solo lo verifica en inglés. – Supertecnoboff

3

Se puede recorrer la cada carácter de la cadena y comprobar que es alfanumérica:

BOOL isMatch = YES; 
for (int i = 0; i < [string length]; i++) { 
    unichar c = [string characterAtIndex:i]; 
    if (!isalnum(c) && c != '_') { 
     isMatch = NO; 
     break; 
    } 
} 
if (isMatch) { 
    // valid 
} else { 
    // invalid 
} 
4

Crear su propio juego de caracteres usando [NSCharacterSet characterSetWithCharactersInString:], luego recorte como estaba haciendo para ver si la cadena devuelta tiene un valor de longitud.

O puede usar invertedSet para eliminar todos los caracteres no configurados, si eso ayudaría a producir una cadena limpia.

35

Puede usar un pred icar:

NSString *myRegex = @"[A-Z0-9a-z_]*"; 
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myRegex]; 
NSString *string = nameField.text; 
BOOL valid = [myTest evaluateWithObject:string]; 

Editar: No di cuenta de que está utilizando [NSString stringWithString:nameField.text].

Use nameField.text en su lugar.

+0

Gracias. Funcionó para mí – Sakthimuthiah

+0

@Sinetris ¿Qué hace el * al final de myRegex? Esto funciona como un campeón! Gracias. – Scooter

-1

esto es una ayuda rápida si ayuda

-(BOOL)isString:(NSString *)s{ 
    char letter = 'A'; 
    //BOOL isLetter=NO; 
    for (int i=0; i<26; i++) { 
     NSString *temp = [NSString stringWithFormat:@"%c",letter+i]; 
     if ([s isEqualToString:temp]) { 
      return YES; 
     } 
    } 
    return NO; 
} 
+0

Este algoritmo solo funciona para cadenas que contienen un único carácter en mayúscula. – Pol

8

Algunos de manera más fácil,

NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"]; 
[allowedSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]]; 
NSCharacterSet *forbiddenSet = [allowedSet invertedSet]; 

Se va a combinar alfanumérica junto con _underscore.

se puede usar como,

NSRange r = [string rangeOfCharacterFromSet:forbiddenSet]; 
if (r.location != NSNotFound) { 
    NSLog(@"the string contains illegal characters"); 
} 

PS. ejemplo copiado de @DaveDeLong ejemplo :)

+0

La pregunta especifica el ejemplo de 'alphanumericCharacterSet' que no es la solución deseada, ya que acepta å, ä, ö, etc. –

+2

Esta respuesta es tan dulce ahora que tengo diabetes. – GeneCode

1

Así es como se puede hacer en Swift (como una extensión de la clase String):

extension String { 

    func containsValidCharacters() -> Bool { 

     var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_") 
     charSet = charSet.invertedSet 

     let range = (self as NSString).rangeOfCharacterFromSet(charSet) 

     if range.location != NSNotFound { 
      return false 
     } 

     return true 
    } 
} 
Cuestiones relacionadas