54 votes

Vérifiez si NSString contient uniquement des caractères alphanumériques + trait de soulignement

J'ai une chaîne qui doit être seulement az, 0-9 et _

Comment puis-je vérifier si l'entrée est valide? J'ai essayé cela mais il accepte des lettres comme å, ä, ö, ø etc.

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

131voto

Dave DeLong Points 156978

Vous pouvez créer votre propre jeu de caractères:

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

Une fois que vous avez cela, vous l'inversez pour tout ce qui n'est pas dans votre chaîne d'origine:

 s = [s invertedSet];
 

Et vous pouvez ensuite utiliser une méthode de chaîne pour déterminer si votre chaîne contient quelque chose dans le jeu inversé:

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

38voto

Sinetris Points 3032

Vous pouvez utiliser un prédicat:

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

Edit: Je n'ai pas remarqué que vous utilisiez [NSString stringWithString:nameField.text] .

Utilisez nameField.text place.

10voto

Hemang Points 3422

Un moyen plus simple,

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

Il combinera alphanumérique et _underscore.

vous pouvez l'utiliser comme,

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

PS exemple copié à partir de @DaveDeLong exemple :)

4voto

Paul Lynch Points 13774

Créez votre propre jeu de caractères en utilisant [NSCharacterSet characterSetWithCharactersInString:] , puis coupez-le comme vous le faites pour voir si la chaîne renvoyée a une valeur de longueur.

Ou vous pouvez utiliser invertedSet pour supprimer tous les caractères non définis, si cela peut aider à produire une chaîne nettoyée.

3voto

Alex Nichol Points 4633

Vous pouvez parcourir tous les caractères de la chaîne et vérifier qu’ils sont alphanumériques:

 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
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X