webentwicklung-frage-antwort-db.com.de

Call kann werfen, aber er ist nicht mit 'try' markiert und der Fehler wird nicht behandelt: NSRegularExpression

Ich habe diese Funktion in String Extension geschrieben und kann den Fehler nicht herausfinden.

func isEmail() -> Bool {
    let regex = NSRegularExpression(pattern: "^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$", options: [.CaseInsensitive])

    return regex.firstMatchInString(self, options: nil, range: NSMakeRange(0, characters.count)) != nil
}

Der Fehler ist:

Call kann werfen, aber es ist nicht mit 'try' markiert und der Fehler wird nicht behandelt

28
Sahil Kapoor

NSRegularExpression(pattern:) gibt einen Fehler aus, wenn das Muster ungültig ist. In Ihrem Fall ist das Muster fixed , daher wäre ein ungültiges Muster Ein Programmierfehler .

Dies ist ein Anwendungsfall für den Ausdruck "erzwungener Versuch" mit try!:

extension String {
    func isEmail() -> Bool {
        let regex = try! NSRegularExpression(pattern: "^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$",
            options: [.CaseInsensitive])

        return regex.firstMatchInString(self, options:[],
            range: NSMakeRange(0, utf16.count)) != nil
    }
}

try! deaktiviert die Fehlerweitergabe, sodass die Methode keinen Fehler auslöst (den der Aufrufer abzufangen hat). Wenn das Muster ungültig ist, bricht es mit einer Laufzeitausnahme ab. Dies hilft, Programmierfehler frühzeitig zu finden.

Man beachte auch, dass NSRange() die Länge von NSString zählt, d. H. Die Anzahl der UTF-16-Codepunkte. Daher sollte __.characters.countutf16.count sein, andernfalls könnte er abstürzen mit Emoji-Zeichen.

55
Martin R

Dies liegt daran, dass der Initialisierer jetzt eine Ausnahme auslösen kann. Sie müssen also try aufrufen, um die Ausnahme aufzurufen, und sich auf catch vorbereiten. Sie können dies tun, indem Sie vor dem Initialisierer try hinzufügen und Ihre Methode mit throws kommentieren.

extension String {
    func isEmail() throws -> Bool {
        let regex = try NSRegularExpression(pattern: "^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$", options: [.CaseInsensitive])

        return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count)) != nil
    }
}

Wenn Sie dann die Methode aufrufen möchten, führen Sie sie aus einem do-Block aus und fangen Sie den Fehler ab.

do {
    try "[email protected]".isEmail()
} catch {
    print(error)
}

Hinweis: Ich habe auch Ihren Aufruf regex.firstMatchInString aktualisiert, um der Tatsache Rechnung zu tragen, dass der Parameter options keinen Nullwert mehr annehmen kann.

13
Mick MacCallum

Wenn Sie es nicht mögen, versuchen Sie es mit catch:

extension String {
    func matchPattern(patStr:String)->Bool {
            var isMatch:Bool = false
            do {
                let regex = try NSRegularExpression(pattern: patStr, options: [.CaseInsensitive])
                let result = regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count))

                if (result != nil)
                {
                    isMatch = true
                }
            }
            catch {
                isMatch = false
            }
            return isMatch
    }
}    

prüfzeichenfolge ist das korrekte E-Mail-Format:

let emailInput:String = "[email protected]"
if (emailInput.matchPattern("^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$"))
{
     print("this is e-mail!")
}
3
Chris Ho

Sie können string.rangeOfString verwenden und die Option auf .RegularExpressionSearch angeben. Es ist einfach.

func isEmail(email: String) -> Bool {
    return email.rangeOfString("^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$", options: .RegularExpressionSearch) != nil
}
1
solos