Проверка TextField с регулярным выражением

Мне нужна помощь с кодом, который смотрит на текстовое поле, убедитесь, что он начинается с (+ или -), после чего имеет 3 целых числа после него.

Таким образом, действительные данные выглядят как +234 или -888

Итак, я начал этот код, но есть 2 проблемы с ним

  • Он правильно проверяет, что введено только 4 символа. Но по какой-то причине вам нужно сфокусироваться на текстовом поле, чтобы кнопка "Готово" на клавиатуре загорелась и спрятала клавиатуру. Если я помещаю менее 4 символов в текстовое поле, то кнопка "Готово" работает нормально. Но я не хочу, чтобы пользователь вводил ничего, кроме 4 символов, а затем нажмите "Готово" и спрячьте клавиатуру. Это первая проблема....

  • Я не знаком с регулярными выражениями и как их использовать в iphone. Поэтому мне нужно добавить к этому регулярному выражению кода для вышеуказанного требования.

    -(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
         NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
         return !([newString length] > 4);
    }
    //Done button to hide the keyboard
    -(IBAction)Done:(id)sender
    {
    
    }
    

Ответ 1

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

Прежде всего два метода делегата:

- (BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
    [aTextField resignFirstResponder];
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)aTextField
{
    return [self validateInputWithString:aTextField.text];
}

Метод тестирования, который возвращает ДА ​​или НЕТ, является ли вход действительным или нет:

- (BOOL)validateInputWithString:(NSString *)aString
{
    NSString * const regularExpression = @"^([+-]{1})([0-9]{3})$";
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regularExpression
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];
    if (error) {
        NSLog(@"error %@", error);
    }

    NSUInteger numberOfMatches = [regex numberOfMatchesInString:aString
                                                        options:0
                                                          range:NSMakeRange(0, [aString length])];
    return numberOfMatches > 0;
}

Что это. Однако я бы рекомендовал показывать пользователю какое-то живое состояние, независимо от того, работает ли его ввод в порядке или нет. Добавьте следующее notifcation, например, в свой метод viewDidLoad:

- (void)viewDidLoad
{
    // ...
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(validateInputCallback:) 
                                                 name:@"UITextFieldTextDidChangeNotification" 
                                               object:nil];
}

- (void)validateInputCallback:(id)sender
{
    if ([self validateInputWithString:textField.text]) {
        // For example turn a label green and let it say: "OK"
    } else {
        // For example turn a label red and let it say: "Allowed: + or minus followed by exactly three digits"
    }
}

Наконец: Если вам нужно получить доступ к группам захвата (+ или - и числу) обычного выражения, следующий код поможет:

// ... reg ex creation ...
NSArray *matches = [regex matchesInString:aString
                                  options:0
                                    range:NSMakeRange(0, [aString length])];

for (NSTextCheckingResult *match in matches) {
    for (int i = 0; i < [match numberOfRanges]; i++) {
        NSLog(@"range %d: %d %d", i, [match rangeAtIndex:i].location, [match rangeAtIndex:i].length);
        NSLog(@"substring %d: %@", i, [aString substringWithRange:[match rangeAtIndex:i]]);
    }
}

Ответ 2

Подтвердите Email id или Телефон, используя Регулярное выражение

Методы Ddelegate:

- (BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
    [aTextField resignFirstResponder];
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)aTextField
{
    return [self validateEmail:aTextField.text]; // Change validateEmail to validatePhone for phone validation.
}

Возвращает YES или NO, является ли вход действительным или нет:

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}

- (BOOL) validatePhone: (NSString *) candidate {
    NSString *phoneRegex = @"^+(?:[0-9] ?){6,14}[0-9]$"; 
    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex]; 

    return [phoneTest evaluateWithObject:candidate];
}

Ответ 3

Вместо этого используйте UIPickerView

Я отклоняюсь от названия вопроса, но IMHO рассматривает то, что вам нужно, может быть лучше использовать UIPickerView для ввода типа "поворотного колеса", как в приложении "Часы" при настройке тревоги. Он может начинаться с "+000", и пользователь может опрокинуть некоторые из четырех колес ([+ -]. [0-9], [0-9], [0-9]) по мере необходимости

Ответ 4

Внесите -textField:shouldChangeCharactersInRange:replacementString в UITextFieldDelegate и используйте NSRegularExpression, чтобы проверить изменения.