2011-09-25 7 views
50

У меня есть строка, которая должна быть только-г, 0-9 и _Проверьте NSString содержит буквенно-цифровые + символы подчеркивания только

Как проверить, если вход действителен? Я попытался это, но он принимает письмо как A, A, O, O и т.д.

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

ответ

126

Вы можете создать свой собственный набор символов:

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

После того, как вы есть, что вы инвертировать его все, что это не в исходной строке:

s = [s invertedSet]; 

И тогда вы можете использовать строку метод, чтобы найти, содержит ли ваша строка что-либо в инвертированном наборе:

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

Но что, если пользователь хочет добавить в эквиваленте к Z на другом языке, таком как китайский? – Supertecnoboff

+0

@Supertecnoboff на китайском языке нет алфавита. Может быть, вы сбиваете с толку японцев Хирагану и Катакана. Или вы имеете в виду все унифицированные идеограммы CJK, и это 80 из 388 из них: https://en.wikipedia.org/wiki/CJK_Unified_Ideographs –

+0

@ Cœur моя точка зрения, как вы можете убедиться, что это проверит, что пользователь вводил числа только в ЛЮБОЙ язык. Это просто проверяет его на английском языке. – Supertecnoboff

3

Вы можете петлю через каждый символ в строке и убедитесь, что это алфавитно-цифровой:

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 
} 
4

Создать ваш собственный набор символов, используя [NSCharacterSet characterSetWithCharactersInString:], затем обрезайте, как вы делали, чтобы увидеть, имеет ли возвращаемая строка значение длины.

Или вы можете использовать invertedSet для удаления всех не заданных символов, если это поможет создать очищенную строку.

35

Вы можете использовать icate:

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

Edit: Я не заметил, что вы используете [NSString stringWithString:nameField.text].

Вместо этого использовать nameField.text.

+0

Спасибо. Это сработало для меня – Sakthimuthiah

+0

@Sinetris Что делает * в конце myRegex? Это работает как чемпион! Благодарю. – Scooter

-1

это быстрый помощник, если это помогает

-(BOOL)isString:(NSString *)s{ 
    char letter = 'A'; 
    //BOOL isLetter=NO; 
    for (int i=0; i<26; i++) { 
     NSString *temp = [NSString stringWithFormat:@"%c",letter+i]; 
     if ([s isEqualToString:temp]) { 
      return YES; 
     } 
    } 
    return NO; 
} 
+0

Этот алгоритм работает только для строк, содержащих один символ верхнего регистра. – Pol

8

Некоторые более легкий путь,

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

Он будет совмещать буквенно-цифровые вместе с _underscore.

вы можете использовать его как,

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

PS. Пример скопирован из примера @DaveDeLong :)

+0

Вопрос конкретно дает пример 'alphanumericCharacterSet', не являющегося желательным решением, поскольку он принимает å, ä, ö, ø и т. Д. –

+2

Этот ответ настолько мил, что теперь у меня диабет. – GeneCode

1

Вот как вы можете это сделать в Swift (как расширение класса String):

extension String { 

    func containsValidCharacters() -> Bool { 

     var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_") 
     charSet = charSet.invertedSet 

     let range = (self as NSString).rangeOfCharacterFromSet(charSet) 

     if range.location != NSNotFound { 
      return false 
     } 

     return true 
    } 
} 
Смежные вопросы