[ios] 신속한 이메일 주소 확인 방법?

누구나 Swift에서 전자 메일 주소의 유효성을 검사하는 방법을 알고 있습니까? 이 코드를 찾았습니다.

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

그러나 나는 그것을 스위프트로 번역 할 수 없습니다.



답변

나는 사용할 것이다 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)
}

3.0 이전의 Swift 버전 :

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

1.2 이전의 Swift 버전 :

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
}


답변

편집, 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)

}

잘 작동합니다.


답변

A와 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() {

}


답변

이를 위해 깨끗하고 간단한 솔루션을 찾고 있다면 https://github.com/nsagora/validation-components를 살펴보십시오. .

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

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

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


답변

합리적인 해결책은 다음과 같습니다.

“합리적인 솔루션”

많은 대용량 앱에서 수년 동안 사용 및 테스트되었습니다.

1- 이 제안에서 자주 볼 수있는 많은 끔찍한 정규식 실수 를 피합니다.

2-그렇지 않습니다 특정 RFC에서 유효하다고 생각되지만 완전히 어리 석고 이메일로 사용할 수 없으며 지원 담당자가 즉시 거부 할 수있는 “x @ x”와 같은 어리석은 이메일 허용 메일러 서비스 (mailchimp, google, aws 등)는 단순히 거부합니다. 어떤 이유로 ‘x @ x’와 같은 문자열을 허용하는 솔루션이 필요한 경우 다른 솔루션을 사용하십시오.

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

4-KISS이며 신뢰할 수 있으며 수많은 사용자가있는 상업용 앱에서 테스트를 거쳤습니다.

5-기술 요점, 술어Apple이 말한 것처럼 전제 조건 입니다 (이것이없는 코드 제안을 조심하십시오)

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

그렇게 쉽습니다.

설명:

이하의 설명에서, “OC”는 문자 또는 숫자와 같은 일반적인 문자를 의미한다.

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

__serverpart … “blah”와 같은 섹션있습니다 . 이는 반복합니다 . (따라서 mail.city.fcu.edu 유형의 것입니다.) 섹션은 OC 로 시작하고 끝나야 하지만 가운데 에는 대시 “-” 가있을 수도 있습니다 . (허용하려는 경우 다른 거기에 이상한 문자, 아마 밑줄을 단순히 대시 전에 추가합니다.) 그것은의 확인을 그냥 섹션 가지고 하나의 OC를. (joe@w.campus.edu에서와 같이) 최대 5 개의 섹션을 가질 수 있으며 하나 가져야합니다. 마지막으로 TLD (예 : .com)의 크기 는 엄격하게 2-8입니다.. 지원 부서에서 선호하는대로 “8”만 변경하십시오.


중요!

술어를 전역으로 유지해야하며 매번 작성하지 마십시오.

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

술어를 캐시하지 않는 제안을 볼 때 매우 놀랍습니다.


답변

올바른 정규 표현식을 사용하여 가장 많이 투표 된 두 가지 답변의 퓨즈는 다음과 같습니다.

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


답변

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