web-dev-qa-db-fra.com

Vérifiez si une chaîne contient au moins une lettre majuscule, un chiffre ou un caractère spécial dans Swift?

J'essaie de créer une méthode qui recherche si une chaîne contient un nombre, une lettre majuscule et un caractère spécial en utilisant une expression régulière comme ci-dessous.

 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

    }

Le problème est que l'expression régulière ci-dessous [A-Z] + renvoie vrai uniquement, par exemple, AVATAR et renvoie faux pour Avatar. Je veux que mon expression régulière retourne true si elle contient au moins un UpperCase dans String.

14
LC 웃

Remplacez simplement votre règle RegEx [A-Z] + par. * [A-Z] +. * (Ainsi que d'autres règles RegEx)

Règles

[A-Z] + ne fait correspondre que les chaînes avec tous les caractères en majuscule 

Exemples: AVATAR, AVA, TAR, AAAAAA
Ne fonctionnera pas: AVATAr

. * correspond à toutes les chaînes (plus de 0 caractères) 

Exemples: 1, 2, AVATAR, AVA, TAR, a, b, c

. * [A-Z] +. * Correspond à toutes les chaînes avec au moins une lettre majuscule 

Exemples: Avatar, avataR, aVatar  

Explication:  

I.. * Essaiera d'égaler 0 ou plus
II. [A à Z] + nécessitera au moins une lettre majuscule (à cause du +)
III. . * essaiera d'égaler 0 ou plus 

Avatar [vide | "A" | "vatar"]
aVatar ["a" | "V" | "atar"]
aVAtar ["a" | "VA" | "le goudron"] 

Code de travail

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

}

Exemples:

checkTextSufficientComplexity("Avatar") // true || false || false
checkTextSufficientComplexity("avatar") // false || false || false
checkTextSufficientComplexity("avatar1") // false || true || false
checkTextSufficientComplexity("avatar!") // false || false || true
29
Joshua Arvin Lat

Voici une version concise de la réponse de Joshuas dans Swift 3, en supposant que toutes les validations doivent être remplies.

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
}
9
croX

Une autre solution alternative.

Vous pouvez effectuer toutes les vérifications à l'aide d'une seule expression régulière. 

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

Vous pouvez l'utiliser comme mention ci-dessous:

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

Au moins 1 majuscule, 1 minuscule, 1 caractère spécial, 1 chiffre et 8 caractères au total.

Pour prendre en charge tous les caractères spéciaux répertoriés dans https://www.owasp.org/index.php/Password_special_characters

! "# $% & '() * +, -./:; <=>? @ [] ^ _` {|} ~

extension String {
    func isValidPassword() -> Bool {
        //let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[ !\"\\\\#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~])[A-Za-z\\d !\"\\\\#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~]{8,}"
        //safe to escape all regex chars
        let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[ !\"\\\\#$%&'\\(\\)\\*+,\\-\\./:;<=>?@\\[\\]^_`\\{|\\}~])[A-Za-z\\d !\"\\\\#$%&'\\(\\)\\*+,\\-\\./:;<=>?@\\[\\]^_`\\{|\\}~]{8,}"
        return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: self)
    }
}
0
jpulikkottil