425 Stimmen

Wie validiert man eine E-Mail-Adresse in Swift?

Kennt jemand eine Möglichkeit, eine E-Mail-Adresse in Swift zu validieren? Ich habe diesen Code gefunden:

- (BOOL) validEmail:(NSString*) emailString {

    if([emailString length]==0){
        return NO;
    }

    NSString *regExPattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";

    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
    NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];

    NSLog(@"%i", regExMatches);
    if (regExMatches == 0) {
        return NO;
    } else {
        return YES;
    }
}

Aber ich kann es nicht nach Swift übersetzen.

895voto

Maxim Shoustin Punkte 77794

Ich würde NSPredicate verwenden:

func isValidEmail(_ email: String) -> Bool {        
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailPred.evaluate(with: email)
}

für Versionen von Swift vor 3.0:

func isValidEmail(email: String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailPred.evaluate(with: email)
}

für Versionen von Swift vor 1.2:

func isValidEmail(email: String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    if let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx) {
        return emailPred.evaluateWithObject(email)
    }
    return false
}

121voto

Nazik Punkte 8577

Bearbeitung, aktualisiert für Swift 3:

func validateEmail(enteredEmail:String) -> Bool {

    let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
    return emailPredicate.evaluate(with: enteredEmail)

}

Ursprüngliche Antwort für Swift 2:

func validateEmail(enteredEmail:String) -> Bool {

    let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
    return emailPredicate.evaluateWithObject(enteredEmail)

}

Es funktioniert gut.

120voto

Arsonik Punkte 2208

Als eine Erweiterung der String-Klasse

SWIFT 4

extension String {
    func isValidEmail() -> Bool {
        // Hier wird `try!` immer erfolgreich sein, da das Muster gültig ist
        let regex = try! NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .caseInsensitive)
        return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
    }
}

Verwendung

if "rdfsdsfsdfsd".isValidEmail() {

}

84voto

alexcristea Punkte 2306

Wenn Sie eine saubere und einfache Lösung suchen, um dies zu tun, sollten Sie sich https://github.com/nsagora/validation-components ansehen.

Es enthält ein E-Mail-Validierungspredicate, das einfach in Ihren Code integriert werden kann:

let email = "test@example.com"
let rule = EmailValidationPredicate()
let isValidEmail = rule.evaluate(with: email)

Hinter den Kulissen verwendet es das RFC 5322 Regelwerk-Regulärer Ausdruck (http://emailregex.com):

let regex = "(?:[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}" +
    "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
    "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[\\p{L}0-9](?:[a-" +
    "z0-9-]*[\\p{L}0-9])?\\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?|\\[(?:(?:25[0-5" +
    "]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" +
    "9][0-9]?|[\\p{L}0-9-]*[\\p{L}0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
    "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"

75voto

Fattie Punkte 34702

(Präambel. Beachten Sie, dass Sie in einigen Fällen diese Lösung jetzt in iOS integriert verwenden können: https://multithreaded.stitchfix.com/blog/2016/11/02/email-validation-swift/)


Die einzige Lösung:

1 - es vermeidet die grausamen Regex-Fehler, die oft im Beispielcode zu sehen sind

2 - es erlaubt KEINE absurden E-Mails wie "x@x"

(Wenn Sie aus irgendeinem Grund eine Lösung benötigen, die unsinnige Zeichenfolgen wie 'x@x' zulässt, verwenden Sie eine andere Lösung.)

3 - der Code ist extrem verständlich

4 - es ist KISS, zuverlässig und auf kommerziellen Apps mit enorm vielen Benutzern getestet

5 - das Prädikat ist global, wie Apple sagt, dass es sein muss

let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,8}"
let __emailPredicate = NSPredicate(format: "SELF MATCHES %@", __emailRegex)

extension String {
    func isEmail() -> Bool {
        return __emailPredicate.evaluate(with: self)
    }
}

extension UITextField {
    func isEmail() -> Bool {
        return self.text?.isEmail() ?? false
    }
}

Es ist so einfach.

Erklärung für jeden, der neu in Regex ist:

In dieser Beschreibung bedeutet "OC" gewöhnliches Zeichen - ein Buchstabe oder eine Ziffer.

__firstpart ... muss mit einem OC starten und enden. Für die Zeichen in der Mitte können Sie bestimmte Zeichen wie Unterstrich haben, aber der Anfang und das Ende müssen ein OC sein. (Es ist jedoch in Ordnung, nur ein OC zu haben und das war's, zum Beispiel: j@blah.com)

__serverpart ... Sie haben Abschnitte wie "blah.", die sich wiederholen. (Beispiel, mail.city.fcu.edu.) Die Abschnitte müssen mit einem OC beginnen und enden, aber in der Mitte können Sie auch ein Bindestrich haben. Es ist in Ordnung, einen Abschnitt zu haben, der nur ein OC ist. (Beispiel, w.campus.edu) Sie können bis zu fünf Abschnitte haben, Sie müssen einen haben. Schließlich ist die TLD (zum Beispiel .com) strikt 2 bis 8 groß. (Ändern Sie natürlich einfach die "8", wie es Ihr Support-Team bevorzugt.)


WICHTIG!

Sie MÜSSEN das Prädikat als global belassen, bauen Sie es nicht jedes Mal neu.

Beachten Sie, dass dies das Erste ist, was Apple in den Dokumenten über das gesamte Problem erwähnt.

Vorschläge, die das Prädikat nicht zwischenspeichern, haben keine Chance.


Nicht-englische Alphabete

Natürlich, wenn Sie mit nicht-englischen Alphabeten umgehen, passen Sie entsprechend an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X