Vérifier si la chaîne de caractères contient des caractères spéciaux dans Swift

j'ai pour détecter si une chaîne contient des caractères spéciaux. Comment puis-je le vérifier? Swift supporte-t-il les expressions régulières?

var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")
if (searchTerm!.rangeOfCharacterFromSet(characterSet).location == NSNotFound){
    println("Could not handle special characters")
}

j'ai essayé le code ci-dessus, mais il ne correspond qu', si j'entre le premier comme un caractère spécial.

21
demandé sur Pang 2014-12-30 12:45:22

6 réponses

votre code vérifiez si aucun caractère de la chaîne ne provient de l'ensemble donné. Ce que vous voulez est de vérifier si le caractère est dans l'ensemble donné:

if (searchTerm!.rangeOfCharacterFromSet(characterSet.invertedSet).location != NSNotFound){
    println("Could not handle special characters")
}

Vous pouvez également y parvenir en utilisant des expressions régulières:

let regex = NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: nil, error: nil)!
if regex.firstMatchInString(searchTerm!, options: nil, range: NSMakeRange(0, searchTerm!.length)) != nil {
    println("could not handle special characters")

}

Le modèle [^A-Za-z0-9] correspond à un caractère qui est à partir des gammes A-Z, a-z ou 0-9.

mise à jour pour Swift 2:

let searchTerm = "a+b"

let characterset = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
if searchTerm.rangeOfCharacterFromSet(characterset.invertedSet) != nil {
    print("string contains special characters")
}

mise à Jour pour Swift 3:

let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
if searchTerm.rangeOfCharacter(from: characterset.inverted) != nil {
    print("string contains special characters")
}
75
répondu Martin R 2017-04-11 03:26:42

inverser votre jeu de caractères fonctionnera, parce que dans votre jeu de caractères vous avez tous les caractères valides:

var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")
if (searchTerm!.rangeOfCharacterFromSet(characterSet.invertedSet).location == NSNotFound){
    println("No special characters")
}

Espérons que cette aide.. :)

5
répondu Rashad 2015-12-24 03:01:12

@Martin r la réponse est géniale, je voulais juste la mettre à jour (la deuxième partie) vers la version 2.1 de Swift

let regex = try! NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: NSRegularExpressionOptions())
if regex.firstMatchInString(searchTerm!, options: NSMatchingOptions(), range:NSMakeRange(0, searchTerm!.characters.count)) != nil {
    print("could not handle special characters")
}

j'ai utilisé try! comme on peut être sûr qu'il crée un regex, il ne se base pas sur n'importe quel type dynamique de données

3
répondu Julian Król 2015-11-20 10:28:05

Cette réponse peut aider les gens qui sont à l'aide de Swift 4.1

func hasSpecialCharacters() -> Bool {

    do {
        let regex = try NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: .caseInsensitive)
        if let _ = regex.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSMakeRange(0, self.count)) {
            return true
        }

    } catch {
        debugPrint(error.localizedDescription)
        return false
    }

    return false
}

extrait de la réponse de @Martin R.

2
répondu Mahendra GP 2018-05-23 07:36:49

selon la définition des caractères spéciaux, vous pouvez utiliser ceci:

let chars =  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"

chars.canBeConvertedToEncoding(NSASCIIStringEncoding)
1
répondu MirekE 2016-06-09 18:46:28

validation du mot de passe avec: - (mot de passe d'au moins huit caractères, un caractère spécial, un MAJUSCULE, Une lettre minuscule et un chiffre)

var isValidateSecialPassword : Bool {

        if(self.count>=8 && self.count<=20){
        }else{
            return false
        }
        let nonUpperCase = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZ").inverted
        let letters = self.components(separatedBy: nonUpperCase)
        let strUpper: String = letters.joined()

        let smallLetterRegEx  = ".*[a-z]+.*"
        let samlltest = NSPredicate(format:"SELF MATCHES %@", smallLetterRegEx)
        let smallresult = samlltest.evaluate(with: self)

        let numberRegEx  = ".*[0-9]+.*"
        let numbertest = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
        let numberresult = numbertest.evaluate(with: self)

        let regex = try! NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: NSRegularExpression.Options())
        var isSpecial :Bool = false
        if regex.firstMatch(in: self, options: NSRegularExpression.MatchingOptions(), range:NSMakeRange(0, self.count)) != nil {
            print("could not handle special characters")
            isSpecial = true
        }else{
            isSpecial = false
        }
        return (strUpper.count >= 1) && smallresult && numberresult && isSpecial
    }
1
répondu ilesh 2018-01-16 13:30:58