regular expresion especiales espacio caracteres blanco alfanumerico 11g iphone objective-c string alphanumeric

iphone - expresion - ¿Cómo verificar si una cadena solo contiene caracteres alfanuméricos en el objetivo C?



expresion regular alfanumerico y espacio en blanco (8)

¿Estoy trabajando en un pequeño proyecto de iPhone y necesitaría comprobar si el nombre de usuario ingresado solo contiene caracteres alfanuméricos? (AZ, az, 0-9 . ¿Cómo hago para verificarlo?


Esto funcionará:

@implementation NSString (alphaOnly) - (BOOL) isAlphaNumeric { NSCharacterSet *unwantedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; return ([self rangeOfCharacterFromSet:unwantedCharacters].location == NSNotFound); } @end


He ejecutado algunas pruebas de rendimiento bastante extensas y hay varias consideraciones a tener en cuenta al elegir cómo validar sus cadenas alfanuméricas. Lo primero, por supuesto, es que puede que ni siquiera le importe el rendimiento. Si su aplicación rara vez valida cadenas, o quizás incluso solo lo hace una vez, cualquier método que le brinde el comportamiento que desea está bien. Más allá de eso, aquí están mis resultados de rendimiento.

Para conjuntos de caracteres personalizados (por ejemplo, caracteres alfanuméricos, sin caracteres o marcas Unicode), esto es más rápido para una ejecución inicial:

NSCharacterSet *alphanumericSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"]; NSString *result = [self stringByTrimmingCharactersInSet:alphanumericSet]; return [result isEqualToString:@""];

Si estás de acuerdo con usar un conjunto de caracteres precomputados como [NSCharacterSet alphanumericCharacterSet] entonces esto fue más rápido:

NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet]; alphanumericSet = alphanumericSet.invertedSet; NSRange range = [self rangeOfCharacterFromSet:alphanumericSet]; return (range.location == NSNotFound);

Guardar el conjunto de caracteres en una variable estática usando dispatch_once puede ayudar bastante si ejecuta estas validaciones repetidamente. En ese caso, si está seguro de que puede absorber el tiempo de compilación inicial, usar una expresión regular en realidad resulta ser el más rápido para conjuntos de caracteres personalizados:

static NSRegularExpression *alphanumericRegex; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ alphanumericRegex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z0-9]*$" options:NSRegularExpressionCaseInsensitive error:nil]; }); NSUInteger numberOfMatches = [alphanumericRegex numberOfMatchesInString:self options:0 range:NSMakeRange(0, self.length)]; return (numberOfMatches == 1);

Si no desea utilizar la expresión regular, la versión de conjunto personalizado de rangeOfCharacterFromSet almacenada en caché rangeOfCharacterFromSet la stringByTrimmingCharactersInCharacterSet: almacenada en stringByTrimmingCharactersInCharacterSet: método:

static NSCharacterSet *alphanumericSet; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ alphanumericSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"]; alphanumericSet = alphanumericSet.invertedSet; }); NSRange range = [self rangeOfCharacterFromSet:alphanumericSet]; return (range.location == NSNotFound);

Para conjuntos precomputados, el método rangeOfCharacterFromSet: almacenado en caché fue nuevamente el más rápido:

static NSCharacterSet *alphanumericSet; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ alphanumericSet = [NSCharacterSet alphanumericCharacterSet]; alphanumericSet = alphanumericSet.invertedSet; }); NSRange range = [self rangeOfCharacterFromSet:alphanumericSet]; return (range.location == NSNotFound);

Y para la información de todos, el método isSupersetOfSet: fue el más lento, ya sea en caché o no. Parece que isSupersetOfSet: es bastante lento.

NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:self]; NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet]; return [alphanumericSet isSupersetOfSet:stringSet];

No hice ninguna prueba de las funciones CFCharacterSet subyacentes.


Las respuestas basadas en NSCharacterSet no brindan los resultados que puede esperar para el texto japonés, etc., a menudo afirman que sí contienen caracteres alfanuméricos. La prueba que se realiza se reduce a "¿hay solo letras o números? Y los caracteres japoneses (etc.) cuentan como ''Letras''.

Si está tratando de verificar los caracteres latinos frente a un idioma extranjero (por ejemplo, japonés), la respuesta de " ¿Cómo determinar si una NSString está basada en latín? " Puede ayudar:

BOOL isLatin = [myString canBeConvertedToEncoding:NSISOLatin1StringEncoding];

NSASCIIStringEncoding también podría usarse en lugar de NSISOLatin1StringEncoding para restringir aún más los caracteres válidos. También puede probar luego usar NSCharacterSet, para excluir caracteres especiales como!, #, Etc.


Puede usar las capacidades de expresión regular de NSString , introducidas en iOS 3.2:

- (BOOL)isAlphanumeric:(NSString *)string { return [string rangeOfString:@"^[a-zA-Z0-9]+$" options:NSRegularExpressionSearch].location != NSNotFound; }



Realmente me gusta el marco RegexKit Lite . Utiliza la biblioteca de expresiones regulares de ICU, que ya está incluida con OSX y es segura para Unicode.

NSString *str = @"testString"; [str isMatchedByRegex:@"^[a-zA-Z0-9]*$"]; // strict ASCII-match [str isMatchedByRegex:@"^[/p{L}/p{N}]*$"]; // unicode letters and numbers match


Si no desea traer una biblioteca de expresiones regulares para esta tarea ...

NSString *str = @"aA09"; NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; BOOL valid = [[str stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""];


- (BOOL)isAlphaNumeric { NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890''. "]; s = [s invertedSet]; NSRange r = [self rangeOfCharacterFromSet:s]; if (r.location == NSNotFound) { return NO; } else { return YES; } }

Tiene la flexibilidad de agregar / restar nuevos caracteres como espacios en blanco

PS Este método se puede copiar / pegar en la categoría NSString