Bir e-posta adresini hızlı bir şekilde nasıl doğrularım?


338

Swift'te bir e-posta adresini nasıl doğrulayacağını bilen var mı? Bu kodu buldum:

- (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;
    }
}

ama Swift'e çeviremiyorum.


8
çeviri açık olmalıdır. hangi kısım size sorun veriyor?
Sulthan

12
Kullanıcılarınızın hiçbirinin yeni üst düzey alanlardan birine sahip olmaması için dua etmeyi unutmayın. Ör..coffee
Matthias Bauch

1
@Antzi: "Birisi @ gmail" ile kontrol ettim ve normal ifadeniz geri döndü.
Đông An

2
Normal ifadeler, kullanıcıların e-posta adreslerini girdiklerini doğrulamak için çalışmaz. Tek% 100 doğru yol, bir etkinleştirme e-postası göndermektir. Bakınız: RFC'yi
Okuyana

2
Bu büyüleyici bir KG. Neredeyse kesinlikle tüm sitede "en yanlış" KG. Şu anda 600 oyla 1 numaralı cevap (ne ?!) Kesinlikle, tamamen, mümkün olan her şekilde yanlış (her bir satır tamamen yanlış ve her kavram ve fikir yanlış ........ !!!) Diğer yüksek oy alan cevapların birçoğu ya "tamamen yanlış", "son derece cılız" ya da düz kırıktır ve hatta derlenmez. Ayrıca, bu Q'nun doğası "elit regex mühendisliği" ni gerektirirken, birçok cevap (çok oy verildi!) Dehşet verici regex mühendisliği özelliğine sahiptir. Gerçekten ilginç bir KG !! Neden??
Fattie

Yanıtlar:


769

Kullanacağım NSPredicate:

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

Swift'in 3.0'dan önceki sürümleri için:

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

Swift'in 1.2'den önceki sürümleri için:

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
}

6
olmaz return emailTest.evaluateWithObject(testStr)çok daha basit ve okunabilir olması? Karşılaştırmak == truebiraz Javascript gibidir.
Sulthan

15
Kullanılabilir bir uzantı olup olmadığını kontrol etmez, a @ a zaten
iyidir

6
Bu test @ test için doğrulamaz ... com
Alan

3
Bu, e-postaları algılamaz. @ İnvalid.com veya e-posta @ .invalid.com. @Alexcristea'dan aşağıdaki cevap
Ben Sullivan

3
............ gibi (1) normal ifadenin tamamen, tamamen yanlış (2) normal ifadenin (ne yapmaya çalıştığı bağlamında bile) büyük hatalar ( 3) Swift yanlıştır (4) bir kenara koysa bile, stil tamamen yanlıştır (5) geri kalan her şey verildiğinde önemli değildir, ancak yüklemi önbelleğe almanız gerektiğinden bile bahsetmez ... esprili olarak, ( 6) kopyalandığı yerden hala kod ("takvim" - ne?) Kaldı.
Fattie

115

Düzenleme, Swift 3 için güncellendi:

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)

}

Swift 2 için orijinal cevap:

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)

}

İyi çalışıyor.


2
ilki geçerli bir normal ifade ile. diğerleri doğru aa @
aach

1
@ netshark1000, sadece upvotes ile, herhangi bir cevap üstünde olacak. :)
Azik Abdullah

NSRegularExpression'un kullanımı NSPredicate'ten daha basit
Guillaume Laurent

1
Etki alanı adından sonra iki nokta koşulunu işlemez. bu yanıtı deneyin stackoverflow.com/a/53441176/5032981
Prashant Gaikwad

@AzikAbdullah 'abc @ gmail..com' yazarsanız, o da doğrulanır
Nij

110

Bir itibariyle Stringsınıf uzantısı

SWIFT 4

extension String {
    func isValidEmail() -> Bool {
        // here, `try!` will always succeed because the pattern is valid
        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
    }
}

kullanım

if "rdfsdsfsdfsd".isValidEmail() {

}

4
countElementsşimdicount
Zack Shapiro

25
xxx @ yyy dönüş doğru mu?
Cullen SUN

1
Cullen SUN ile aynı, foo @ bar dönüşü true.
Rémy Virin

3
.tld içermeyen user @ host da geçerli bir e-posta adresidir, örneğin root @ localhost
Çar

1
NSRange length özelliğinin characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

64

Bunu yapmak için temiz ve basit bir çözüm arıyorsanız, https://github.com/nsagora/validation-components adresine göz atmalısınız .

Kodunuza kolayca entegre edilebilen bir e-posta doğrulama yüklemi içerir:

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

Kaputun arkasında eski RFC 5322 reg kullanıyor ( 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])+)\\])"

3
Wow, emailregex.com'u bilmiyordum. Bu mükemmel!
Samuel Ev

2
Son olarak, e-postaları filtreleyen biri. @. Email.com
Ben Sullivan

tam olarak çalışıyor - abcd@abcd.com. abc @ abc doğru değil
Anil Gupta

Ah, Sonunda ..: D
Ümañg ßürmån

39

İşte makul çözüm:

"MAKUL ÇÖZÜM"

Birçok büyük hacimli uygulamada yıllarca kullanılmış ve test edilmiştir.

1 - bu önerilerde sıkça gördüğünüz birçok korkunç normal ifade hatasını önler

2 - bu mu DEĞİL gibi aptal e-postalara izin "x @ x" belirli RFC'lere altında geçerli olduğu düşünülen, ama tamamen saçma, e-postaları olarak kullanılamaz edildiğiniz ve destek personeli anında reddedecek ve tüm hangilerinin posta hizmetleri (mailchimp, google, aws, vb.) basitçe reddeder. (Herhangi bir nedenle) 'x @ x' gibi dizelere izin veren bir çözüme ihtiyacınız varsa, başka bir çözüm kullanın.

3 - kod çok, çok, çok anlaşılabilir

4 - KISS, güvenilir ve çok sayıda kullanıcılı ticari uygulamalarda imha için test edildi

5 - teknik bir nokta, yüklem küreseldir, Apple olması gerektiği gibi (buna sahip olmayan kod önerilerine dikkat edin)

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

İşte bu kadar kolay.

Açıklama:

Aşağıdaki açıklamada, "OC" sıradan karakter anlamına gelir - bir harf veya rakam.

__firstpart ... bir OC ile başlayıp bitmelidir . Karakter için ortada sen olabilir bazı tür çizgi gibi karakterler, ancak başlangıç ve bitiş bir OC olmak zorunda. (Ancak, yalnızca bir OC'ye sahip olmak sorun değildir ve işte bu, örneğin: j@blah.com)

__serverpart ... "falan" gibi bölümleriniz var . hangi tekrar . (Yani mail.city.fcu.edu türü.) Bölümler bir OC ile başlayıp bitmelidir , ancak ortada da bir tire işareti "-" olabilir. (Eğer izin vermek isterseniz başka orada sıradışı karakterler, belki alt çizgi basitçe çizgi önce ekleyin.) It adlı Tamam sadece bir kesite sahip olması için bir OC. (Joe@w.campus.edu adresinde olduğu gibi) En fazla beş bölümünüz olabilir, bir bölümünüz olması gerekir. Son olarak TLD (.com gibi) kesinlikle 2 ila 8 boyutunda. Açıkçası, bu "8" i destek departmanınızın tercih ettiği şekilde değiştirin.


ÖNEMLİ!

Yüklemi küresel olarak tutmalı, her seferinde inşa etmemelisin.

Apple'ın dokümanlardaki tüm sorun hakkında bahsettiği ilk şey olduğunu unutmayın .

Yüklemi önbelleğe almayan önerileri görmek çok şaşırtıcı.


1
.Engineer gibi yeni TLD'leri destekliyor mu?
Roman

hi @Roman - "Sonunda TLD (.com veya benzeri) kesinlikle 2 ila 8 harftir" yazdığını açıkça belirtin. Bu onunla ilgilenir. "8" i tercih ettiğiniz bir değere değiştirebilirsiniz. (Şimdilik, birçok büyük şirkette, müşteri hizmetleri herhangi bir uzun TLD'yi sadece bir aldatmaca olarak reddedecektir - ancak yine de, bu sizin kararınızdır, "8" veya istediğiniz herhangi bir değeri kullanın.)
Fattie

2
Madde 4'e gelince: bir çok kullanıcıyla nasıl test yaptınız? Normal uygulama e-posta adreslerini kullanmalarını engellediğinden, ticari uygulamalara kaydolamayan kullanıcıları izlediniz mi? Tek "makul" olmalıdır, spec (RFC) belirttiği veya bu elde edilemezse, o zaman daha rahat bir şey, ama spec her şeyi kapsar. Kullanıcıların x @ x girmesine izin verilmezse, herhangi bir normal ifadenizi iletecek bir garbage@example.com gireceklerdir.
thetrutz

hi @thetrutz, "garbage@example.com" tamamen normal bir e-posta adresidir. RFC, "x @ x" gibi teorik aptallık içerir. Sizin veya benim çalıştığım gerçek ticari müşteriler "bunlara izin verme" der. (herhangi bir gerçek dünya büyük işinde, yukarıdaki açıklamada Roma'ya bahsettiğim gibi, burada kaba taslaktan daha fazla kısıtlama olduğunu unutmayın.) Son cümleniz kafa karıştırıcı - tabii ki "işleyen bir e-posta" herhangi bir yerel test? Ne demek istiyorsun? Açıkçası e-postalar yalnızca "e-postanızı onaylayın" sistemleri aracılığıyla doğrulanır.
Fattie

Swift'te her işlemi optimize etmeye ihtiyaç vardır çünkü genellikle bu dili sunucu tarafında kullanırız.
Nicolas Manzini

25

İşte en çok oylanan iki cevabın doğru regex ile bir sigortası: yüklemi kullanarak bir String uzantısı, böylece string.isEmail'i çağırabilirsiniz

    extension String {
        var isEmail: Bool {
           let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,20}"            
           let emailTest  = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
           return emailTest.evaluateWithObject(self)
        }
    }

19

Swift 5'te en basit yol

extension String {
    var isValidEmail: Bool {
        NSPredicate(format: "SELF MATCHES %@", "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}").evaluate(with: self)
    }
}

Misal

"kenmueller0@gmail.com".isValidEmail

İadeler...

true

2
tekrarlanan cevabı tekrarlamanın anlamı nedir? Swift 5 özelliklerine bağlı değil
rommex

17

Dize bir uzantısı olarak kullanmanızı öneririm:

extension String {    
    public var isEmail: Bool {
        let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)

        let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length))

        return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
    }

    public var length: Int {
        return self.characters.count
    }
}

Ve kullanmak için:

if "hodor@gameofthrones.com".isEmail { // true
    print("Hold the Door")
}

1
NSRange length özelliğinin, characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

Swift 4'ü Güncelle: extension String {public var isEmail: Bool {let dataDetector = dene? NSDataDetector (türleri: NSTextCheckingResult.CheckingType.link.rawValue) let firstMatch = dataDetector? .FirstMatch (in: self, seçenekler: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange (location: 0, length: count)) return (firstatch). range.location! = NSNotFound && firstMatch? .url? .scheme == "mailto")}
Duan Nguyen

15

Bu, Swift 2.0 - 2.2 için güncellenmiş sürümüdür

 var isEmail: Bool {
    do {
        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.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
    } catch {
        return false
    }
}

8
foo @ bar doğru döner?!
Rémy Virin

2
aa @
aach'ı

4
Çünkü RFC bu e-posta adreslerini doğru olarak doğrular;)
dulgan

NSRange length özelliğinin, characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

yüklemi önbelleğe almamak gerçekten yanlış / kötü. Apple'ın doco'daki sorun hakkında söylediği ilk şey. sayfadaki cevapların çoğu tarafından yapılan göz kamaştırıcı bir hata.
Fattie

9

Burada birçok doğru yanıt var, ancak "normal ifade" nin çoğu eksik ve "name @ domain" gibi bir e-posta geçerli bir e-posta ile sonuçlanıyor olabilir, ancak değil. İşte tam çözüm:

extension String {

    var isEmailValid: Bool {
        do {
            let regex = try NSRegularExpression(pattern: "(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-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]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", options: .CaseInsensitive)
            return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
        } catch {
            return false
        }
    }
}

düzgün çalışmıyorsa, alan adından sonra boşluk eklemenizi sağlar.
Juan Boero

NSRange length özelliğinin, character.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

@Fattie ifadenizi savunuyor. Yorumunuz çok işe yaramaz, bir iyileştirme önerin, bir düzeltme önerin. Tamamen yanlış demek çok aptalca ve yakın bir zihniyetin altında
Andrea.Ferrando

"Burada çok sayıda doğru cevap var" cümlenin yanlış olduğu :) :)
Fattie

8

İşte dayalı bir yöntem rangeOfString:

class func isValidEmail(testStr:String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let range = testStr.rangeOfString(emailRegEx, options:.RegularExpressionSearch)
    let result = range != nil ? true : false
    return result
}

Not: güncellenmiş TLD uzunluğu.

İşte RFC 5322'ye göre e-posta için kesin RegEx, bunun yalnızca e-posta adreslerinin temel sözdizimini kontrol ettiği ve üst düzey alanın mevcut olup olmadığını kontrol etmediği için kullanılmadığını unutmayın.

(: [A-z0-9 # $% & '* + / = ^ _ `{|} ~ -? + (?.!: \ [A-z0-9 # $% &!]'? * + / ? = ^ _ `{|} ~ -] +) *
  | "(: [\ X01- \ X08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ X5b \ x5d- \ x7f]
      | \\ [\ x01- \ X09 \ x0b \ x0c \ x0e- \ x7f]) * ")
@ (?: (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? \.) + [a-z0-9] (?: [ a-z0-9 -] * [a-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] | [a-z0-9 -] * [a- 0-9]:
          (: [\ X01- \ X08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ X5a \ x53- \ x7f]
          | \\ [\ x01- \ X09 \ x0b \ x0c \ x0e- \ x7f]) +)
     \])

RegExs e-postası hakkında daha ayrıntılı bilgi için Regular-Expressions.info sayfasına bakın .

Objective-C veya Swift gibi bir dilin gerektirdiği şekilde kaçmanın mümkün olmadığını unutmayın.


1
kullandığınız emailRegEx basit bir şekilde yanlıştır. Sadece 2 ila 4 karakter uzunluğunda TLD'lere izin verirken, benzer alanlar .engineervar.
Antzi

Anladım, cevabımı değil, düzenleme seviyesini savunuyorum. Yukarıdaki gibi bir yorum ekleyin, aşağı oy verin, daha iyi bir cevaba işaret edin, kendi cevabınızı ekleyin. Bir cevabı büyük ölçüde değiştirmek uygun değildir. Bütünlük için yaygın RegEx ekledim.
zaph

Neden ah neden sadece cevabı silmiyorsun? Onu burada tutmak için ne gibi bir sebep olabilir?
Fattie

7

Bunun için bir uzantı kullanmayı tercih ederim. Ayrıca, bu url http://emailregex.com normal ifadenin doğru olup olmadığını test etmenize yardımcı olabilir. Aslında, site bazı programlama dilleri için farklı uygulamalar sunmaktadır. Swift 3 için uygulamamı paylaşıyorum .

extension String {
    func validateEmail() -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
        return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self)
    }
}

birkaç sorun var .. örneğin .. blah @ .abc orada tuhaf bir nokta ile
Fattie

5

Hızlı 2.1 için: bu, foo @ bar e-postası ile doğru şekilde çalışır

extension String {
    func isValidEmail() -> Bool {
        do {
            let regex = try NSRegularExpression(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}", options: .CaseInsensitive)
            return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
        } catch {
                return false
        }
    }
}

1
Bu benim için iyi görünüyor. Seçebiliyorsanız beri Bildiğim kadarıyla sen 'AZ' (büyük harfler) ihmal bile olabilir anladığım kadarıyla .CaseInsensitive ... Neyse set
AZOM

NSRange length özelliğinin, character.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

5

Swift 4.2 Kullanımı

extension String {
    func isValidEmail() -> Bool {
        let regex = try? NSRegularExpression(pattern: "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$", options: .caseInsensitive)
        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
    }
    func isValidName() -> Bool{
        let regex = try? NSRegularExpression(pattern: "^[\\p{L}\\.]{2,30}(?: [\\p{L}\\.]{2,30}){0,2}$", options: .caseInsensitive)

        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
    } }

Ve kullanılmış

if (textField.text?.isValidEmail())! 
    {
      // bla bla
    }
else 
    {

    }

4

@Fattie'nin "THE REASONABLE SOLUTION" için yeni bir sürümü Swift 4.1'de şu adresteki yeni bir dosyada test edildi String+Email.swift:

import Foundation

extension String {
    private static let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
    private static let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
    private static let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,6}"

    public var isEmail: Bool {
        let predicate = NSPredicate(format: "SELF MATCHES %@", type(of:self).__emailRegex)
        return predicate.evaluate(with: self)
    }
}

Yani kullanımı basit:

let str = "mail@domain.com"
if str.isEmail {
    print("\(str) is a valid e-mail address")
} else {
    print("\(str) is not a valid e-mail address")
}

E-posta adresi olmanın kendilerine özgü (veya değil) olması nedeniyle func, Stringnesnelere a eklemek istemiyorum. Yani bir Boolmülk funcbenim anlayışımdan birinden daha iyi olurdu .


2

Basit bir uzantı oluşturun:

extension NSRegularExpression {

    convenience init(pattern: String) {
        try! self.init(pattern: pattern, options: [])
    }
}

extension String {

    var isValidEmail: Bool {
        return isMatching(expression: NSRegularExpression(pattern: "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"))
    }

    //MARK: - Private

    private func isMatching(expression: NSRegularExpression) -> Bool {
        return expression.numberOfMatches(in: self, range: NSRange(location: 0, length: characters.count)) > 0
    }
}

Misal:

"b@bb.pl".isValidEmail //true
"b@bb".isValidEmail //false

Hiçbir şey için uzantısı aşağıdaki uzatabilirsiniz sen gerekmez: isValidPhoneNumber, isValidPasswordvb ...


NSRangeLength özelliğinin String utf16.countyerine kullanması gerektiğini unutmayıncharacters.count
Leo Dabus

2

In Swift 4.2 ve Xcode 10.1

//Email validation
func isValidEmail(email: String) -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
    var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
    if valid {
        valid = !email.contains("Invalid email id")
    }
    return valid
}

//Use like this....
let emailTrimmedString = emailTF.text?.trimmingCharacters(in: .whitespaces)
if isValidEmail(email: emailTrimmedString!) == false {
   SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter valid email")
}

SharedClass'ı kullanmak istiyorsanız.

//This is SharedClass
import UIKit
class SharedClass: NSObject {

static let sharedInstance = SharedClass()

//Email validation
func isValidEmail(email: String) -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
    var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
    if valid {
        valid = !email.contains("Invalid email id")
    }
    return valid
}

private override init() {

}
}

Ve böyle işlev çağırın ....

if SharedClass.sharedInstance. isValidEmail(email: emailTrimmedString!) == false {
   SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter correct email")
   //Your code here
} else {
   //Code here
}

1

Giriş doğrulamaları için tasarlanmış bir kütüphane yaptım ve "modüller" den biri bir sürü şeyi kolayca doğrulamanızı sağlıyor

Örneğin bir e-postayı doğrulamak için:

let emailTrial = Trial.Email
let trial = emailTrial.trial()

if(trial(evidence: "test@test.com")) {
   //email is valid
}

SwiftCop kütüphane ... umarım yardımcı olur!


1

İşte Swift 3'te bir uzantı

extension String {
    func isValidEmail() -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self)
    }
}

Sadece şu şekilde kullanın:

if yourEmailString.isValidEmail() {
    //code for valid email address
} else {
    //code for not valid email address
}

Regex'i alexcristea'nın cevabından değiştirmek için mükemmel bir çözüm.
17:28

0

Şu anda çok fazla garip üst düzey alan adı olduğundan, üst alanın uzunluğunu kontrol etmeyi bırakıyorum ...

İşte ne kullanıyorum:

extension String {

    func isEmail() -> Bool {
        let emailRegEx = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"
        return NSPredicate(format:"SELF MATCHES %@", emailRegEx).evaluateWithObject(self)
    } 
}

0

Çok da işe yarıyor ...

let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"

func validate(email: String) -> Bool {
    let matches = email.rangeOfString(regex, options: .RegularExpressionSearch)
    if let _ = matches {
        return true
    }
    return false
}

0

@Arsonik yanıtı, sunulan diğer çözümlerden daha az ayrıntılı kod kullanarak Swift 2.2'ye güncellenmiştir:

extension String {
    func isValidEmail() -> Bool {
        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?.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
    }
}

abcd @ a bu normal ifadeyle geçiyor. Bunu düzeltmelisin.
Günhan

NSRange length özelliğinin, characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

0

@ JeffersonBe'nin yanıtı yakındır, ancak truedize "birisi@something.com geçerli bir e-posta içeren bir şey" ise döndürür , bu da istediğimiz şey değildir. Aşağıda, String'te iyi çalışan (geçerli phoneNumber ve diğer veri dedektörlerinin önyükleme yapmasına izin veren bir uzantı yer almaktadır.

/// Helper for various data detector matches.
/// Returns `true` iff the `String` matches the data detector type for the complete string.
func matchesDataDetector(type: NSTextCheckingResult.CheckingType, scheme: String? = nil) -> Bool {
    let dataDetector = try? NSDataDetector(types: type.rawValue)
    guard let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length)) else {
        return false
    }
    return firstMatch.range.location != NSNotFound
        // make sure the entire string is an email, not just contains an email
        && firstMatch.range.location == 0
        && firstMatch.range.length == length
        // make sure the link type matches if link scheme
        && (type != .link || scheme == nil || firstMatch.url?.scheme == scheme)
}
/// `true` iff the `String` is an email address in the proper form.
var isEmail: Bool {
    return matchesDataDetector(type: .link, scheme: "mailto")
}
/// `true` iff the `String` is a phone number in the proper form.
var isPhoneNumber: Bool {
    return matchesDataDetector(type: .phoneNumber)
}
/// number of characters in the `String` (required for above).
var length: Int {
    return self.characters.count
}

NSRange length özelliğinin characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

0

Ve Swift 3 için :

extension String {
    func isValidEmail() -> Bool {
        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: NSMakeRange(0, self.characters.count)) != nil
    }
}

NSRange length özelliğinin characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

0

Yanıt listesine tek eklemem, Linux için NSRegularExpressionmevcut olmaması, aslındaRegularExpression

    func isEmail() -> Bool {

    let patternNormal = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"

    #if os(Linux)
        let regex = try? RegularExpression(pattern: patternNormal, options: .caseInsensitive)
    #else
        let regex = try? NSRegularExpression(pattern: patternNormal, options: .caseInsensitive)
    #endif

    return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil

Bu hem macOS hem de Ubuntu üzerinde başarıyla derlenir.


NSRange length özelliğinin characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus

0

İçin en iyi sonuç ile en iyi çözüm

Swift 4.x

 extension String {

        func validateAsEmail() -> Bool {
            let emailRegEx = "(?:[a-zA-Z0-9!#$%\\&‘*+/=?\\^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%\\&'*+/=?\\^_`{|}" +
                "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
                "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" +
                "z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-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]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
            "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"

            let emailTest = NSPredicate(format:"SELF MATCHES[c] %@", emailRegEx)
            return emailTest.evaluate(with: self)
        }
    }

0

Uzantı oluşturmayı seviyorum

   extension String {

func isValidateEmail() -> 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: self)
}

}

kullanımı:

if emailid.text!.isValidateEmail() == false(){
 //do what ever you want if string is not matched.

}

0

Hızlı 5

 func isValidEmailAddress(emailAddressString: String) -> Bool {

 var returnValue = true
 let emailRegEx = "[A-Z0-9a-z.-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,3}"

 do {
        let regex = try NSRegularExpression(pattern: emailRegEx)
        let nsString = emailAddressString as NSString
        let results = regex.matches(in: emailAddressString, range: NSRange(location: 0, length: nsString.length))

        if results.count == 0
        {
            returnValue = false
        }

    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        returnValue = false
    }

    return  returnValue
}

Sonra:

let validEmail = isValidEmailAddress(emailAddressString: "your@email.com")
print(validEmail)

0

Google E-posta gibi Mükemmel Regex

"^[A-Z0-9a-z][a-zA-Z0-9_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"

2
cevabımı kim oylarsa seçsin, lütfen bilginizi kontrol edin. Bu regex'i birçok kodda uyguladım ve arkadaşlarım bu regex'i kullanıyor ve harika çalışıyor.
ami rt

Bence cevap verebilirim: Normal ifadeniz basit ve RFC ile eşleşmiyor. Örneğin, e-postalarda ilk bölümde tırnak işaretleri ve hatta boşluklar olabilir! Haacked.com/archive/2007/08/21/…
Hugal31

1
Üzgünüm kardeşim, sanırım google e-posta doğrulamasını kontrol etmelisiniz, bir e-postanın ilk bölümüne Boşluk eklemenin bir yolu yoktur ve benim normal ifadem yanlışsa neden kimse yazma ve mükemmel normal ifade göndermiyor?
ami rt

RFC 5322'ye göre, "Merhaba dünya!" @ Example.com geçerli bir e-postadır. Gerçekten de, geçerli bir normal ifade yapmak neredeyse imkansızdır. Her posta sağlayıcısı Google e-posta doğrulamasına sadık kalmaz.
Hugal31

1
Dinlemek istediğim şey budur ve bu yüzden kalın başlıkta yukarıda normal ifadenin Google gibi olduğunu söylemiştim. Teşekkürler
ami rt

-1

Veya isteğe bağlı UITextField metni için uzantınız olabilir:

nasıl kullanılır:

if  emailTextField.text.isEmailValid() {
      print("email is valid")
}else{
      print("wrong email address")
}

uzantı:

extension Optional where Wrapped == String {
    func isEmailValid() -> Bool{
        guard let email = self else { return false }
        let emailPattern = "[A-Za-z-0-9.-_]+@[A-Za-z0-9]+\\.[A-Za-z]{2,3}"
        do{
            let regex = try NSRegularExpression(pattern: emailPattern, options: .caseInsensitive)
            let foundPatters = regex.numberOfMatches(in: email, options: .anchored, range: NSRange(location: 0, length: email.count))
            if foundPatters > 0 {
                return true
            }
        }catch{
            //error
        }
        return false
    }
}

NSRange length özelliğinin characters.count yerine String utf16.count kullanması gerektiğini unutmayın
Leo Dabus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.