Проверка NSString содержит как буквы, так и цифры - PullRequest
7 голосов
/ 22 августа 2010

Я ищу лучший способ проверить, что строка NSString содержит как числовые, так и алфавитные символы.До сих пор я придумал код, приведенный ниже, но он просто говорит мне, что не было введено никаких символов, которые не являются цифрами или буквами.

if( [[myNSString stringByTrimmingCharactersInSet:
            [NSCharacterSet alphanumericCharacterSet]] isEqualToString:@""]){    
  //The string only contains alpha or numerical characters.
  //But now I want to check that both character sets are present ?    
}

Ответы [ 3 ]

14 голосов
/ 22 августа 2010

Просто обрежьте letterCharacterSet и decimalDigitCharacterSet и проверьте, не равна ли полученная строка исходной строке:

if (![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]] isEqualToString:myOriginalString] 
     && ![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]] isEqualToString:myOriginalString]) {
...
}
5 голосов
/ 08 декабря 2012

Ответ kovpas работает нормально, если у вас есть буквы в начале или конце и цифры на противоположном конце. Проблема возникает, если между буквами вставлены цифры или наоборот, например, «abc123abc». Вот решение:

if (![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str]  
    && ![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str]) {  
    ....  
}
4 голосов
/ 13 мая 2013

Я не уверен, что два предыдущих ответа охватывают требования, поэтому это ответ, соответствующий более строгой интерпретации требований.

Принимая требования из комментариев в коде исходного поста:

//The string only contains alpha or numerical characters.   
//But now I want to check that both character sets are present?

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

NSString 'rangeOfCharacterFromSet: находит символ в строке, если он принадлежит определенному набору, поэтому мы можем использовать его.

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
}

Как подробно описано в документах, rangeOfCharacterFromSet: возвращает NSRange {NSNotFound, 0}, если в строке не найдено символов из набора. Это похоже на другие методы поиска строк или символов в строке в Какао.

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