sourcetip

이메일 주소를 신속하게 확인하는 방법은 무엇입니까?

fileupload 2023. 5. 13. 10:43
반응형

이메일 주소를 신속하게 확인하는 방법은 무엇입니까?

스위프트에서 이메일 주소를 확인하는 방법을 아는 사람이 있습니까?다음 코드를 찾았습니다.

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

스위프트로 번역할 수 없어요

다음을 사용합니다.

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

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

String 확장 기능

스위프트 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
    }
}

사용.

if "rdfsdsfsdfsd".isValidEmail() {

}

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)

}

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)

}

잘 작동하고 있습니다.

이를 위한 깨끗하고 간단한 솔루션을 찾고 있다면 https://github.com/nsagora/validation-components 을 살펴봐야 합니다.

코드에 쉽게 통합할 수 있는 전자 메일 유효성 검사 술어가 포함되어 있습니다.

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

후드 뒤에는 RFC 5322 레덱스(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])+)\\])"

(서론.경우에 따라 iOS에 내장된 이 솔루션을 사용할 수 있습니다. https://multithreaded.stitchfix.com/blog/2016/11/02/email-validation-swift/ )


유일한 해결책:

1 - 예제 코드에서 자주 볼 수 있는 끔찍한 정규식 실수를 방지합니다.

2 - "x@x"와 같은 말도 안 되는 이메일을 허용하지 않습니다.

(어떤 이유로 'x@x'와 같은 넌센스 문자열을 허용하는 솔루션이 필요한 경우 다른 솔루션을 사용하십시오.)

3 - 코드는 매우 이해하기 쉽습니다.

4 - KISS, 신뢰할 수 있으며 엄청난 수의 사용자를 가진 상용 앱에서 파괴 테스트를 거쳤습니다.

5 - 술어애플이 말하는 처럼 글로벌합니다.

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

그 정도로 쉽습니다.

정규식에 처음 온 사람에 대한 설명:

이 설명에서 "OC"는 일반 문자(문자 또는 숫자)를 의미합니다.

__첫 부분...OC로 시작하고 끝나야 합니다.중간에 있는 문자의 경우 밑줄과 같은 특정 문자를 사용할 수 있지만 시작과 끝은 OC여야 합니다. (단, OC가 하나만 있어도 괜찮습니다. 예: j@blah.com)

__서버 파트...반복되는 "blah"와 같은 섹션이 있습니다(예: mail.city.fcu.edu ).섹션은 OC로 시작하고 끝나야 하지만 중간대시 "-"를 사용할 수도 있습니다.OC가 하나인 섹션은 괜찮습니다. (예: w.campus.edu ) 섹션은 최대 5개까지 가능합니다. 하나만 있어야 합니다.마지막으로 TLD(예: .com)의 크기는 엄격하게 2-8입니다(지원 부서에서 선호하는 대로 "8"만 변경하십시오).


중요한!

술어를 글로벌로 유지해야 하며, 매번 술어를 작성해서는 안 됩니다.

이것이 애플이 문서에서 전체 문제에 대해 언급한 첫 번째 사항입니다.

술어를 캐시하지 않는 제안은 시작하지 않습니다.


영어 이외의 문자

자연스럽게 영어 이외의 알파벳을 다룰 경우에는 적절하게 조정해야 합니다.

Swift 5에서 가장 간단한 방법

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

"kenmueller0@gmail.com".isValidEmail

반환...

true

여기 올바른 정규식과 함께 가장 많이 투표된 두 개의 답변, 즉 string.isEmail을 호출할 수 있도록 술어를 사용하는 String 확장이 있습니다.

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

String:의 확장자로 사용하는 것을 제안합니다.

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

사용 방법:

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

이것은 Swift 2.0 - 2.2의 업데이트된 버전입니다.

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

여기에는 많은 정답이 있지만 대부분의 "regex"가 불완전하고 "name@domain"과 같은 전자 메일이 유효한 전자 메일을 생성하지만 그렇지 않을 수 있습니다.여기에 완전한 솔루션이 있습니다.

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

다음은 다음을 기반으로 하는 방법입니다.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)
    return range != nil
}

참고: TLD 길이가 업데이트되었습니다.

다음은 RFC 5322에 따른 전자 메일에 대한 최종 ReGEx입니다. 전자 메일 주소의 기본 구문만 확인하고 최상위 도메인이 있는지는 확인하지 않으므로 사용하지 않는 것이 좋습니다.

(?:[a-z0-9!#$%&'*+/=?^_'{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|  "(?:[\x01-\x08\x0b\x0c-\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-\x1f\x21-\x5a\x53-\x7f]\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

이메일 ReGEx에 대한 자세한 내용은 Regular-Expressions.info 을 참조하십시오.

Objective-C 또는 Swift와 같은 언어에서 요구하는 이스케이프는 없습니다.

저는 그것을 위해 연장을 사용하는 것을 선호합니다.또한 이 URL http://emailregex.com 은 정규식이 올바른지 테스트하는 데 도움이 됩니다.실제로 이 사이트는 일부 프로그래밍 언어에 대해 다른 구현을 제공합니다.Swift 3에 대한 구현을 공유합니다.

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

이것은 스위프트 4.1에서 테스트된 @Fattie의 "합리적인 솔루션"의 새로운 버전입니다.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)
    }
}

따라서 사용 방법은 간단합니다.

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

저는 단순히 추가하는 것을 좋아하지 않습니다.func에▁String전자 메일 주소가 되는 개체는 개체에 고유합니다(또는 고유하지 않습니다).비상대기상태Bool부동산은 a보다 더 잘 맞을 것입니다.func내가 알기로는

swift 2.1의 경우: 이메일 foo@bar에서 올바르게 작동합니다.

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

Swift 4.2 사용

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

그리고 사용됨

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

    }

한테를수단간스니다행합트▁for▁a▁test▁simple다▁a▁make니행수에 대한 간단한 테스트를 해보세요.@그리고..확인 이메일을 보냅니다.

고려 사항:

  • 전 세계의 절반이 비 ASC를 사용함II 캐릭터.
  • 정규식은 느리고 복잡합니다.Btw z가 아닌 문자/문자/유니코드 범위를 적어도 확인합니다.
  • RFC 규칙과 해당 정규식이 너무 복잡하기 때문에 전체 유효성 검사를 수행할 수 없습니다.

나는 이 기본 검사를 사용합니다.

// similar to https://softwareengineering.stackexchange.com/a/78372/22077
import Foundation

/**
 Checks that
 - length is 254 or less (see https://stackoverflow.com/a/574698/412916)
 - there is a @ which is not the first character
 - there is a . after the @
 - there are at least 4 characters after the @
*/
func isValidEmail(email: String) -> Bool {
    guard email.count <= 254 else { 
        return false 
    }
    let pos = email.lastIndex(of: "@") ?? email.endIndex
    return (pos != email.startIndex)
        && ((email.lastIndex(of: ".") ?? email.startIndex) > pos) 
        && (email[pos...].count > 4)
}

print(isValidEmail(email: "アシッシュ@ビジネス.コム")) // true

참고:

  • 정규식 및 NSDataDetector보다 상당히 빠릅니다.

  • 다음 항목이 유효한 것으로 올바르게 보고됩니다.

Håkan.Söderström@malmö.se"
punnycode@XN--0ZWM56D.XN--HGBK6AJ7F53BBA"
试@例子.测试.مثال.آزمایشی"
foo.bar+something@blah.com"
m@foo.co.uk
  • 다음은 실제로 유효하지만 사용자 오류의 결과일 가능성이 높기 때문에 잘못된 것으로 보고됩니다.
a @ b
a@b

관련:

@JeffersonBe의 대답은 가까웠지만, 돌아옵니다.true문자열이 "someone@something.com 이 포함된 유효한 전자 메일"인 경우 이는 우리가 원하는 것이 아닙니다.다음은 String에서 잘 작동하는 확장 기능입니다(그리고 부팅할 유효한 phoneNumber 및 기타 데이터 디텍터를 테스트할 수 있습니다).

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

단순 확장자 만들기:

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

예:

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

필요한 항목으로 할 수 .isValidPhoneNumber,isValidPassword 타기......

입력 유효성 검사를 위해 설계된 라이브러리를 만들었는데 "모듈" 중 하나를 사용하면 여러 가지를 쉽게 유효성 검사할 수 있습니다.

전자 메일의 유효성을 확인하는 예:

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

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

스위프트캅은 도서관...도움이 되길 바랍니다!

Swift 2.2에 대한 답변 @Arsonik 답변 업데이트, 제공된 다른 솔루션보다 자세한 코드 사용:

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

할 수 의 경우에는 응목제것은경다우니입리의눅스답추가가한록에▁for▁addition▁that▁my▁be다▁would▁to니입니다.NSRegularExpression. 존하지않다니습, 은사실재입니다.RegularExpression

    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

이것은 macOS와 Ubuntu 모두에서 성공적으로 컴파일됩니다.

스위프트 3의 확장 버전입니다.

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

다음과 같이 사용합니다.

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

최적의 결과를 제공하는 최고의 솔루션

스위프트 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)
        }
    }

저는 @Azik 답변을 개선했습니다.가이드라인에서 허용하는 특수 문자를 더 허용하고 추가 에지 사례 몇 개를 무효로 반환합니다.

그 단체는 여기서 계속되는 것이 단지 허용된다고 생각합니다.._%+-가이드라인에 따라 로컬 부분이 올바르지 않습니다.이 질문에 대한 @Anton Gogolev 답변을 참조하거나 아래를 참조하십시오.

이메일 주소의 로컬 부분에는 다음과 같은 ASCII 문자를 사용할 수 있습니다.

  • 대문자와 소문자의 라틴 문자A로.Z그리고.a로.z;

  • 숫자들0로.9;

  • 특수 문자!#$%&'*+-/=?^_`{|}~;

  • .따옴표로 묶지 않는 한 첫 문자 또는 마지막 문자가 아니며 따옴표로 묶지 않는 한 연속적으로 나타나지 않는 경우(예:John..Doe@example.com허용되지 않지만"John..Doe"@example.com허용됨);

  • 공간 및"(),:;<>@[\]문자는 제한 사항과 함께 사용할 수 있습니다(아래 단락에 설명된 대로 따옴표로 묶은 문자열 내부에서만 사용할 수 있으며, 백슬래시 또는 이중 괄호 앞에 백슬래시가 있어야 함). 주석이 허용됩니다.

  • 로컬 파트의 양쪽 끝에 괄호가 있는 경우(예:john.smith(comment)@example.com그리고.(comment)john.smith@example.com둘 다 같은 값입니다.john.smith@example.com;

내가 사용하는 코드는 제한된 특수 문자를 허용하지 않지만 여기서 대부분의 답변보다 더 많은 옵션을 허용합니다.저는 주의 측면에서 실수보다는 좀 더 완화된 검증을 선호합니다.

if enteredText.contains("..") || enteredText.contains("@@") 
   || enteredText.hasPrefix(".") || enteredText.hasSuffix(".con"){
       return false
}

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: enteredText)

Swift 4.2 및 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")
}

공유 클래스를 사용하려는 경우.

//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() {

}
}

그리고 이렇게 호출 기능을...

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

다음은 표준 라이브러리를 사용하여 정규식을 유지할 필요가 없는 최신 놀이터 호환 버전입니다.

import Foundation

func isValid(email: String) -> Bool {
  do {
    let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    let range = NSRange(location: 0, length: email.count)
    let matches = detector.matches(in: email, options: .anchored, range: range)
    guard matches.count == 1 else { return false }
    return matches[0].url?.scheme == "mailto"
  } catch {
    return false
  }
}

extension String {
  var isValidEmail: Bool {
    isValid(email: self)
  }
}

let email = "test@mail.com"
isValid(email: email) // prints 'true'
email.isValidEmail // prints 'true'

위의 정규식 예제의 대부분은 전자 메일에 기본적인 문제가 있는 경우에도 오류를 감지하지 못합니다.예를들면

  1. h..1@nyu.edu연속된 점들
  2. ab1234@.nyu.edu@ 뒤에 점을 찍다
  3. a.bcdnle12.@email.com@ 앞에 점을 찍다
  4. .abc@email.com점으로 시작합니다.

여기 더 엄격한 규칙이 있는 정규식을 사용하는 문자열 확장자가 있습니다.

extension String {
    func isValidEmail() -> Bool {
        let emailRegEx = "^(?!\\.)([A-Z0-9a-z_%+-]?[\\.]?[A-Z0-9a-z_%+-])+@[A-Za-z0-9-]{1,20}(\\.[A-Za-z0-9]{1,15}){0,10}\\.[A-Za-z]{2,20}$"
        let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        return emailPred.evaluate(with: self)
   }
}

테스트 케이스를 작성하는 방법은 다음과 같습니다.

XCTAssertFalse("ab1234@.nyu.edu".isValidEmail())
XCTAssertTrue("valid_email@email.com".isValidEmail())

이상한 최상위 도메인 이름이 너무 많아서 최상위 도메인의 길이를 확인하지 않습니다...

제가 사용하는 것은 다음과 같습니다.

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

역시 효과가 있는 것 같군요...

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
}

스위프트 3의 경우:

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

언급URL : https://stackoverflow.com/questions/25471114/how-to-validate-an-e-mail-address-in-swift

반응형