Проверьте, содержит ли строка NSSt специальный символ и цифру - PullRequest
8 голосов
/ 18 июля 2011

Мне нужно проверить, содержит ли строка одну заглавную букву, одну строчную букву, одно целое число и один специальный символ. Как мне проверить?

Ответы [ 5 ]

14 голосов
/ 18 июля 2011

Без каких-либо дополнительных платформ:

NSCharacterSet * set = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"] invertedSet];

if ([aString rangeOfCharacterFromSet:set].location != NSNotFound) {
    NSLog(@"This string contains illegal characters.");
}

Вы также можете использовать регулярное выражение (этот синтаксис от RegexKitLite: http://regexkit.sourceforge.net):

if ([aString isMatchedByRegex:@"[^a-zA-Z0-9]"]) {
    NSLog(@"This string contains illegal characters.");
}
9 голосов
/ 18 июля 2014

Нашел чуть лучшую реализацию. Улучшение ответа Амиша

- (BOOL)isValidString:(NSString *)string
{
    return [string rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]].location != NSNotFound &&
    [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]].location != NSNotFound &&
    [string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound;
}
4 голосов
/ 13 января 2013

Маулик неверный ответ.Это будет проверять на наличие ДРУГОГО, чем любой буквенно-цифровой символ, но не требует наличия одной заглавной буквы, одной строчной буквы и одного целого числа.На самом деле вам нужно сделать 3 проверки для проверки каждого ограничения.

NSCharacterSet *lowerCaseChars = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyz"];

NSCharacterSet *upperCaseChars = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLKMNOPQRSTUVWXYZ"];

NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

if ([aString rangeOfCharacterFromSet:lowerCaseChars].location == NSNotFound || [aString rangeOfCharacterFromSet:upperCaseChars].location = NSNotFound || [aString rangeOfCharacterFromSet:numbers].location == NSNotFound) {
 NSLog(@"This string contains illegal characters");
}
1 голос
/ 29 июня 2014

Для арабского / английского

NSString *regEx = @"^([a-zA-Z0-9\u0600-\u06ff](\\-|\\_|\\.|\\ )?)+$";
        NSPredicate *regExPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regEx];
        BOOL myStringMatchesRegEx = [regExPredicate evaluateWithObject: self.text];
        if (!myStringMatchesRegEx)
            return NO;
0 голосов
/ 18 июля 2011

Вот что я бы сделал.Создайте регулярные выражения для каждого условия, которое необходимо проверить, присутствует ли соответствующее значение.

т.е. регулярное выражение для проверки наличия в нем одной заглавной буквы, одной строчной буквы, одного целого и одного специального символа и т. Д..

и затем используйте ту же строку для проверки каждого регулярного выражения, если все они возвращают true, если у вас есть победитель, если нет, то строка не соответствует вашим критериям.

// Пример дляValidating UpperCaseLetter делает то же самое для всех остальных с соответствующим регулярным выражением.

-(BOOL) validateOneUpperCaseLetter:(NSString *)string {
if ((string == nil) || ([string isEqualToString: @""])) {
    return NO;
}

// Change this regEx to one you needed. // this one validates for the "name".  
NSString *regEx = @"^[a-zA-Z]+(([\\'\\,\\.\\ -][a-zA-Z])?[a-zA-Z]\\s*)*$";
NSPredicate *regExPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regEx];
BOOL myStringMatchesRegEx = [regExPredicate evaluateWithObject: string];

if (!myStringMatchesRegEx) {
    return NO;
}
return YES;}
...