Проверьте, содержит ли строка хотя бы букву upperCase, цифру или специальный символ в Swift?

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

 func checkTextSufficientComplexity(var text : String) -> Bool{


            let capitalLetterRegEx  = "[A-Z]+"
            var texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx)
            var capitalresult = texttest.evaluateWithObject("AniP")
            println("\(capitalresult)")


            let numberRegEx  = "[0-9]+"
            var texttest1 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
            var numberresult = texttest1.evaluateWithObject(text)
            println("\(numberresult)")


            let specialCharacterRegEx  = "[.*&^%$#@()/]+"
            var texttest2 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)

            var specialresult = texttest2.evaluateWithObject(text)
            println("\(specialresult)")

           return capitalresult && numberresult && specialresult

    }

Проблема заключается в следующем регулярном выражении [A-Z] + возвращает true только для AVATAR и возвращает false для Avatar. Я хочу, чтобы мое регулярное выражение возвращало true, если оно содержит хотя бы одну UpperCase в String.

Ответ 1

Просто замените правило RegEx [A-Z] + с помощью. * [A-Z]+. * (и других правил RegEx)

Правила

[A-Z] + соответствует только строкам со всеми заглавными буквами

Примеры: AVATAR, AVA, TAR, AAAAAA
Не работает: AVATAr

. * соответствует всем строкам (0+ символов)

Примеры: 1, 2, AVATAR, AVA, TAR, a, b, c

. * [A-Z]+. * соответствует всем строкам с хотя бы одной заглавной буквой

Примеры: Avatar, avataR, aVatar

Объяснение:

я.. * будет пытаться сопоставить 0 или более ничего. II. [A-Z] + потребуется хотя бы одна заглавная буква (из-за +)
III.. * будет пытаться сопоставить 0 или более ничего

Аватар [пусто | "A" | "Vatar" ]
aVatar [ "a" | "V" | "Атар" ]
aVAtar [ "a" | "ВА" | "tar" ]

Рабочий код

func checkTextSufficientComplexity(var text : String) -> Bool{


    let capitalLetterRegEx  = ".*[A-Z]+.*"
    var texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx)
    var capitalresult = texttest!.evaluateWithObject(text)
    println("\(capitalresult)")


    let numberRegEx  = ".*[0-9]+.*"
    var texttest1 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
    var numberresult = texttest1!.evaluateWithObject(text)
    println("\(numberresult)")


    let specialCharacterRegEx  = ".*[!&^%$#@()/]+.*"
    var texttest2 = NSPredicate(format:"SELF MATCHES %@", specialCharacterRegEx)

    var specialresult = texttest2!.evaluateWithObject(text)
    println("\(specialresult)")

    return capitalresult || numberresult || specialresult

}

<сильные > Примеры:

checkTextSufficientComplexity("Avatar") // true || false || false
checkTextSufficientComplexity("avatar") // false || false || false
checkTextSufficientComplexity("avatar1") // false || true || false
checkTextSufficientComplexity("avatar!") // false || false || true

Ответ 2

Вот краткая версия ответа Джошуа в Swift 3, предполагая, что все проверки должны выполняться.

func validate(password: String) -> Bool {
    let capitalLetterRegEx  = ".*[A-Z]+.*"
    let texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx)
    guard texttest.evaluate(with: password) else { return false }

    let numberRegEx  = ".*[0-9]+.*"
    let texttest1 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
    guard texttest1.evaluate(with: password) else { return false }

    let specialCharacterRegEx  = ".*[!&^%$#@()/_*+-]+.*"
    let texttest2 = NSPredicate(format:"SELF MATCHES %@", specialCharacterRegEx)
    guard texttest2.evaluate(with: password) else { return false }

    return true
}

Ответ 3

Другое альтернативное решение.

Вы можете выполнить все проверки, используя одно регулярное выражение.

RegExp: ^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[[email protected]$!%*?&])[A-Za-z\\[email protected]$!%*?&]{8,}

Вы можете использовать это, как указано ниже:

//Minimum 8 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 1 Number and 1 Special Character:
let regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[[email protected]$!%*?&])[A-Za-z\\[email protected]$!%*?&]{8,}"
let isMatched = NSPredicate(format:"SELF MATCHES %@", regex).evaluate(with: yourTextField.text)
if(isMatched  == true) {
    // Do your stuff ..
}  else {
    // Show Error Message.
}