Подтвердить что ты не робот

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

У меня есть строка, которая должна быть только a-z, 0-9 и _

Как проверить правильность ввода? Я пробовал это, но он принимает письмо типа å, ä, ö, ø и т.д.

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

Ответ 1

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

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

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

s = [s invertedSet];

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

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

Ответ 2

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

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 вместо этого.

Ответ 3

Несколько более простой способ,

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:)

Ответ 4

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

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

Ответ 5

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

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
}

Ответ 6

Здесь вы можете сделать это в 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
    }
}

Ответ 7

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

-(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;
}