Je cherche la meilleure façon de vérifier qu'une nstring contient des caractères numériques et alphabétiques.
Ce que je suis arrivé jusqu'à présent, c'est le code ci-dessous, mais cela me dit simplement qu'aucun personnage n'a été entré, ce qui ne sont pas des chiffres ni des lettres.
3 Réponses :
Il suffit de couper Letcharacterset et décimaldigitcharactterset et vérifiez si la chaîne produite n'est pas égale à la chaîne d'origine:
if (![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]] isEqualToString:myOriginalString] && ![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]] isEqualToString:myOriginalString]) { ... }
Merci. Oui c'est ce que j'ai fini par faire à la fin.
Détecter un bug: si la chaîne contient le caractère de contrôle, il renvoie oui, c'est faux.
La réponse de Kovpas fonctionne bien si vous avez des lettres au début ou à la fin et aux chiffres de l'extrémité opposée. Un problème se produit si des chiffres sont intégrés entre des lettres ou inversement, tels que «ABC123ABC». Voici une solution:
if (![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str] && ![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str]) { .... }
Cette réponse fonctionne beaucoup mieux! Je ne sais pas pourquoi vous utilisez inversedset code> cependant. Merci
L'astuce à ce problème est qu'il est plus compliqué de vérifier une affirmation. Le premier chèque construit une chaîne sans chiffres; Si la chaîne est identique à l'original, il n'y a pas de chiffres dans la chaîne. Une vérification similaire est faite avec la deuxième vérification des lettres. C'est pourquoi il n'y a pas pour les 2 conditions.
Oui, mais vous n'avez pas besoin d'utiliser inversedset code>, cela fonctionne parfaitement même sans elle
Je ne suis pas sûr que les deux réponses précédentes couvrent les exigences. Il s'agit donc d'une réponse correspondant à une interprétation plus stricte des exigences.
Prendre les exigences des commentaires du code d'origine: P>
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 }
Je sais que c'est l'hérésie de dire ceci, mais la façon la plus simple, la plus compréhensible et la plus efficace de le faire est presque certainement pour simplement boucler dans la chaîne, extraire chaque caractère avec
caractérisatindex code> et le tester contre le limites appropriées. Avec les autres, vous feriez mieux d'avoir de bons commentaires de bons bons remarquables si vous voulez comprendre le code 6 mois à partir de maintenant.