Comment vérifier si une chaîne ne contient que des caractères alphanumériques dans l’objective C?

Je travaille sur un petit projet iphone et je devrais vérifier si le nom d’utilisateur entré ne contient que des caractères alphanumériques? (AZ, az, 0-9 . Comment pourrais-je le vérifier?

Si vous ne voulez pas utiliser une bibliothèque regex pour cette tâche unique …

 NSSsortingng *str = @"aA09"; NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; BOOL valid = [[str ssortingngByTrimmingCharactersInSet:alphaSet] isEqualToSsortingng:@""]; 

Cela fonctionnera:

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

Vous pouvez utiliser cette bibliothèque d’expressions régulières pour ObjectiveC. Utilisez la regex suivante pour faire correspondre:

 ^[a-zA-Z0-9]*$ 

Les réponses basées sur NSCharacterSet ne donnent pas les résultats escomptés pour le texte japonais, mais prétendent souvent qu’elles contiennent des caractères alphanumériques. ‘Des lettres’.

Si vous essayez de vérifier les caractères latins par rapport à une langue étrangère (par exemple, le japonais), la réponse de ” Comment déterminer si une NSSsortingng est basée sur le latin? ” Peut aider:

 BOOL isLatin = [mySsortingng canBeConvertedToEncoding:NSISOLatin1SsortingngEncoding]; 

NSASCIISsortingngEncoding pourrait également être utilisé à la place de NSISOLatin1SsortingngEncoding pour restreindre davantage les caractères valides. Vous pouvez également tester avec NSCharacterSet pour exclure des caractères spéciaux tels que!, #, Etc.

J’ai effectué des tests de performances assez approfondis et plusieurs considérations doivent être sockets en compte lors du choix de la validation de vos chaînes alphanumériques. Tout d’abord, bien sûr, vous ne vous souciez peut-être même pas de la performance. Si votre application valide rarement des chaînes, ou peut-être seulement une fois, quelle que soit la méthode qui vous donne le comportement souhaité. Au-delà, voici mes résultats de performance.

Pour les jeux de caractères personnalisés (disons des caractères alphanumériques, sans les caractères Unicode ou les marques), ceci est le plus rapide pour une exécution initiale:

 NSCharacterSet *alphanumericSet = [NSCharacterSet characterSetWithCharactersInSsortingng:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"]; NSSsortingng *result = [self ssortingngByTrimmingCharactersInSet:alphanumericSet]; return [result isEqualToSsortingng:@""]; 

Si vous préférez utiliser un jeu de caractères précalculé comme [NSCharacterSet alphanumericCharacterSet] cela a été le plus rapide:

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

La mise en cache du jeu de caractères dans une variable statique à l’aide de dispatch_once peut aider un peu si vous exécutez ces validations à plusieurs resockets. Dans ce cas, si vous êtes certain de pouvoir absorber le temps de compilation initial, l’utilisation d’une regex s’avère être la plus rapide pour les jeux de caractères personnalisés:

 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 numberOfMatchesInSsortingng:self options:0 range:NSMakeRange(0, self.length)]; return (numberOfMatches == 1); 

Si vous ne souhaitez pas utiliser l’expression régulière, la version de jeu personnalisée de rangeOfCharacterFromSet cache rangeOfCharacterFromSet la méthode ssortingngByTrimmingCharactersInCharacterSet: :

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

Pour les ensembles précalculés, la méthode rangeOfCharacterFromSet: cache était à nouveau la plus rapide:

 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); 

Et pour toutes les informations, la méthode isSupersetOfSet: était la plus lente, qu’elle soit mise en cache ou non. On dirait que isSupersetOfSet: c’est assez lent.

 NSCharacterSet *ssortingngSet = [NSCharacterSet characterSetWithCharactersInSsortingng:self]; NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet]; return [alphanumericSet isSupersetOfSet:ssortingngSet]; 

Je n’ai pas testé les fonctions CFCharacterSet sous-jacentes.

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

A la possibilité d’append / soustraire de nouveaux caractères comme les espaces blancs

PS Cette méthode peut être copier / coller dans la catégorie NSSsortingng

J’aime vraiment le framework RegexKit Lite . Il utilise la bibliothèque regex ICU, qui est déjà incluse avec OSX et qui est compatible avec Unicode.

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

Vous pouvez utiliser les capacités d’expression régulière NSSsortingng , introduites dans iOS 3.2:

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