Изменить изображение, если при редактировании текстовое поле соответствует регулярному выражению - PullRequest
0 голосов
/ 03 марта 2020

У меня есть UITextField и подключенный textFieldDidChange метод, в котором я хотел бы проверить, является ли text «правильным». У меня есть три разных условия, которые я хотел бы проверить.

textFieldDidChange-Method:

@objc func textFieldDidChange(_ textField: UITextField) {

    switch textField {
    case passwordTextField:
        // check for upper and lowercase letter
        if (textField.text!.matches("^(?=.*[A-Z]).(?=.*[a-z])$")){
            checkLetterImage.image = UIImage(named: "correct")
        }else {
            checkLetterImage.image = UIImage(named: "false")
        }

        // check for length -> min 8
        if(textField.text!.matches("^{8,}$")){
            checkLengthImage.image = UIImage(named: "correct")
        }else {
            checkLengthImage.image = UIImage(named: "false")
        }

        // check for at least one number
        if(textField.text!.matches("^(?=.*[0-9])")){
            checkNumberImage.image = UIImage(named: "correct")
        }else {
            checkNumberImage.image = UIImage(named: "false")
        }

        break

    default:
        break
    }

}

matches-Method:

public extension String {
    func matches(_ regex: String) -> Bool {
        return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil
    }
}

Понятия не имею, почему код выше не работает. Я что-то не так делаю с Regex? Это никогда не происходит ни в одном из if-cases ...

Обновление:

«Проверка номера» работает отлично , Проверка верхнего и нижнего регистров не работает вообще, а проверка длины работает не так, как должна: она отображает «правильный» образ после того, как вы что-то наберете и снова все удалите.

Кто-нибудь знает, почему это происходит ????

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Наборы символов на помощь!

Попробуйте это:

if text.count > 8 {

}

if text.rangeOfCharacter(from: .lowercaseLetters) != nil {

}

if text.rangeOfCharacter(from: .uppercaseLetters) != nil {

}

if text.rangeOfCharacter(from: .decimalDigits) != nil {

}
0 голосов
/ 03 марта 2020

Я думаю, что ваши ^ и $ якоря могут быть проблемой.

Попробуйте это:

    switch textField {
    case passwordTextField:
        // check for upper and lowercase letter
        if (textField.text!.matches("(?=.*[a-z])(?=.*[A-Z])")){
            checkLetterImage.image = UIImage(named: "correct")
        }else {
            checkLetterImage.image = UIImage(named: "false")
        }

        // check for length -> min 8
        if(textField.text!.matches(".{8,}")){
            checkLengthImage.image = UIImage(named: "correct")
        }else {
            checkLengthImage.image = UIImage(named: "false")
        }

        // check for at least one number
        // could also use  (?=.*\\d)
        if(textField.text!.matches("(?=.*[0-9])")){
            checkNumberImage.image = UIImage(named: "correct")
        }else {
            checkNumberImage.image = UIImage(named: "false")
        }

        break
...