web-dev-qa-db-ger.com

Überprüfen Sie, ob die Zeichenfolge Sonderzeichen in Swift enthält

Ich muss feststellen, ob eine Zeichenfolge Sonderzeichen enthält. Wie kann ich das überprüfen? Unterstützt Swift reguläre Ausdrücke?

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

Ich habe den obigen Code ausprobiert, aber er stimmt nur überein, wenn ich das erste Zeichen als Sonderzeichen eingebe.

23
iPhone Guy

Ihr Code überprüft, ob kein Zeichen in der Zeichenfolge aus dem angegebenen Satz stammt. Was Sie wollen, ist zu überprüfen, ob ein Zeichen nicht in der gegebenen ist einstellen:

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

Sie können dies auch mit regulären Ausdrücken erreichen:

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")

}

Das Muster [^A-Za-z0-9] stimmt mit einem Zeichen überein, das nicht aus den Bereichen A-Z, a-z oder 0-9 ist.

pdate für Swift 2:

let searchTerm = "a+b"

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

pdate für Swift 3:

let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
if searchTerm.rangeOfCharacter(from: characterset.inverted) != nil {
    print("string contains special characters")
}
78
Martin R

Diese Antwort kann den Leuten helfen, die Swift 4.1 benutzen

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
}

Entnommen aus der Antwort von @Martin R.

6
Mahendra

Das Invertieren Ihres Zeichensatzes funktioniert, da Sie in Ihrem Zeichensatz alle gültigen Zeichen haben:

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

Hoffe das hilft.. :)

5
Rashad

Passwortüberprüfung Mit folgenden Angaben: - (Passwort mindestens acht Zeichen lang, ein Sonderzeichen, ein Großbuchstabe, ein Kleinbuchstabe und eine Ziffer)

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
    }
3
Ilesh

@Martin R Antwort ist großartig, ich wollte es nur aktualisieren (der zweite Teil) auf Swift 2.1 Version

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")
}

Ich benutzte try! da wir sicher sein können, dass es einen regulären Ausdruck erzeugt, basiert es nicht auf einer dynamischen Art von Daten

3
Julian Król

Abhängig von der Definition von Sonderzeichen können Sie Folgendes verwenden:

let chars =  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"

chars.canBeConvertedToEncoding(NSASCIIStringEncoding)
2
MirekE

Zwei Lösungen:

1)

extension String {
    var stripped: String {
        let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ")
        return self.filter {okayChars.contains($0) }
    }
}

2)

class TrimDictionary {

    static func trimmedWord(wordString: String) -> String {
        var selectedString = wordString

        let strFirst = selectedString.first
        let strLast = selectedString.last

        let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
        if strFirst?.description.rangeOfCharacter(from: characterset.inverted) != nil {
            selectedString = String(selectedString.dropFirst())
        }
        if strLast?.description.rangeOfCharacter(from: characterset.inverted) != nil {
            selectedString = String(selectedString.dropLast())
        }
        return selectedString
    }
}
0
kishor0011