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


338

누구나 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;
    }
}

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


8
번역은 간단해야합니다. 어떤 부분이 문제를 일으키는가?
Sulthan

12
사용자 중 누구도 새로운 최상위 도메인 중 하나를 갖지 않도록기도하는 것을 잊지 마십시오. 예 :.coffee
Matthias Bauch

1
@Antzi : "someone @ gmail"로 확인하고 정규 표현식이 true를 반환했습니다.
Đông An

2
정규식은 사용자가 자신의 전자 메일 주소를 입력했는지 확인하기 위해 작동하지 않습니다. 100 % 올바른 방법은 활성화 이메일을 보내는 것입니다. 참조 : 내가 아는 어떻게 읽어 RFC까지로의 유효성을 검사 이메일 주소
mouviciel

2
이것은 매혹적인 QA입니다. 거의 모든 사이트에서 "가장 잘못된"QA입니다. 600 표 ( 현재 ?!) 의 현재 # 1 답변 은 모든 가능한 방식으로 절대적으로, 완전히, 잘못되었습니다 (모든 개별 행이 완전히 잘못되어 있고 모든 개념과 아이디어가 잘못되었습니다 ........ !!!) 투표율이 높은 다른 많은 답변은 "완전히 잘못됨", "매우 어리 석음"또는 보통 깨져서 컴파일되지도 않습니다. 또한,이 Q의 특성상 "엘리트 정규식 엔지니어링"이 필요하지만 많은 답변 (높은 투표!)이 정규식 엔지니어링을 놀라게합니다. 정말 흥미로운 QA입니다! 왜??
Fattie

답변:


769

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

6
return emailTest.evaluateWithObject(testStr)훨씬 간단하고 읽기 쉽지 않습니까? 와 비교하는 == true것은 Javascript와 약간 비슷합니다.
Sulthan

15
사용 가능한 확장이 있는지 확인하지 않습니다. a @ a는 이미 정상입니다 :(
CularBytes

6
이것은 test @ test ... com에 대해 유효하지 않습니다
Alan

3
email. @ invalid.com 또는 email @ .invalid.com을 감지하지 못합니다. @alexcristea의 답변은 다음과 같습니다
Ben Sullivan

3
............뿐만 아니라 (1) 정규 표현식이 완전히 정확하지 않습니다. (2) 정규 표현식 (수행하려는 컨텍스트 내에서도)에 중대한 오류가 있습니다 ( 3) 스위프트가 잘못되었습니다 (4) 옆으로, 스타일 이 완전히 잘못되었습니다 (5) 나머지는 모두 중요하지는 않지만 술어 를 캐시 해야한다고 언급하지도 않습니다. 6) 여전히 코드남아 있습니다. 가 복사 된 곳 ( "calendar"-무엇?)가 있습니다.
Fattie

115

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

}

잘 작동합니다.


2
유효한 정규 표현식이있는 첫 번째. 다른 사람은 aa @ aach의 유효성을 검사합니다
netshark1000

1
@ netshark1000, upvotes 만 있으면 모든 답변이 맨 위에 표시됩니다. :)
Azik Abdullah

NSRegularExpression은 NSPredicate보다 사용하기가 더 쉽습니다
Guillaume Laurent

1
도메인 이름 다음에 두 점 조건을 처리하지 않습니다. 이 답변을 시도하십시오 stackoverflow.com/a/53441176/5032981
Prashant Gaikwad

@AzikAbdullah 'abc @ gmail..com'을 입력하면 유효성이 검사됩니다
Nij

110

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

}

4
countElements지금count
잭 샤피로

25
xxx @ yyy는 true를 반환합니까?
Cullen SUN

1
Cullen SUN과 동일하며 foo @ bar는 true를 반환합니다.
레미 비린

3
.tld가없는 user @ host도 유효한 이메일 주소입니다 (예 : root @ localhost
Wed

1
NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

64

이를 위해 깨끗하고 간단한 솔루션을 찾고 있다면 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])+)\\])"

3
와우, emailregex.com에 대해 몰랐습니다. 대단해!
Samuel Ev

2
마지막으로 email. @. email.com을 필터링하는 필터
Ben Sullivan

정확하게 작동합니다-abcd@abcd.com. 그렇지 검증 ABC @ ABC의
아닐 굽타

아, 마지막으로 .. : D
Ümañg ßürmån

39

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

"합리적인 솔루션"

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

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이 언급 한 첫 번째 사항 입니다.

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


1
.engineer와 같은 새로운 TLD를 지원합니까?
로마

안녕하세요 @Roman- "TLD (.com 등)는 엄격히 2 ~ 8 자로 엄격하게 표기되어 있습니다." 그것은 그것을 처리합니다. "8"을 원하는 값으로 변경할 수 있습니다. (현재 많은 대기업에서 고객 서비스는 단순히 긴 TLD를 사기로 거부합니다. 그러나 어쨌든 그것은 "8"또는 원하는 값을 사용하는 결정입니다.)
Fattie

2
포인트 (4)와 관련하여 : 많은 사용자를 어떻게 테스트 했습니까? 정규식으로 인해 이메일 주소를 사용하지 못하게 되었기 때문에 상용 앱에 가입 할 수없는 사용자를 추적 했습니까? 유일한 "합리적"은 스펙 (RFC)이 지정하거나 달성 할 수없는 경우보다 완화 된 것이지만 스펙의 모든 것을 포함해야합니다. 사용자가 x @ x를 입력 할 수없는 경우, 여러분의 / 모든 정규식을 통과하는 garbage@example.com을 입력합니다.
thetrutz

안녕하세요 @thetrutz, "garbage@example.com"은 완전히 일반적인 이메일 주소입니다. RFC에는 "x @ x"와 같은 이론적 관용구가 포함됩니다. 귀하 또는 제가 근무하는 실제 상업 고객은 "그것을 허용하지 않습니다"라고 말합니다. (실제 대기업에서는 위의 주석에서 언급 한 것처럼 로마의 거친 개요보다 훨씬 더 많은 제한이 있습니다.) 최종 문장은 혼란 스럽습니다. 물론 "비 기능 이메일"은 현지 시험? 무슨 소리 야? 분명히 이메일은 궁극적으로 "이메일 확인"시스템을 통해서만 확인됩니다.
Fattie

Swift에서는 일반적으로 서버 측에서이 언어를 사용하므로 모든 프로세스를 최적화해야합니다.
Nicolas Manzini

25

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

    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에서 가장 간단한 방법

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

2
반복되는 대답을 반복하는 요점은 무엇입니까? Swift 5 기능에 의존하지 않는
rommex

17

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

1
NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

Swift 4 업데이트 : 확장 문자열 {public var isEmail : Bool {let dataDetector = try? NSDataDetector (유형 : NSTextCheckingResult.CheckingType.link.rawValue) let firstMatch = dataDetector? .firstMatch (in : self, options : NSRegularExpression.MatchingOptions.reportCompletion, 범위 : NSRange (location : 0, length : count)) return (firstMatch ?. range.location! = NSNotFound && firstMatch? .url? .scheme == "mailto")}
Duan Nguyen

15

이것은 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
    }
}

8
foo @ bar는 true를 반환합니까?!
레미 비린

2
aa @ aach를 true로 확인 함
netshark1000

4
은 RFC 사실 이러한 이메일 adresses 유효성을 검사하기 때문의)
dulgan

NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

술어를 캐시하지 않는 것은 실제로 잘못되었습니다. 도코의 문제에 대해 애플이 가장 먼저 언급 한 것은이 때문이다. 페이지의 대부분의 답변으로 눈부신 실수.
Fattie

9

여기에는 많은 정답이 있지만 "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
        }
    }
}

제대로 작동하지 않으면 도메인 뒤에 공백을 추가 할 수 있습니다.
Juan Boero

NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

@Fattie는 귀하의 진술을 주장합니다. 귀하의 의견은 매우 쓸모가 없으며 개선을 제안하고 수정을 제안하십시오. 완전히 잘못 말하는 것은 매우 어리 석고 친밀한 사고 방식에 기반합니다
Andrea. Ferrando

"여기에 정답이 많이있다" 는 문장이
엄청나게

8

다음을 기반으로하는 방법이 있습니다 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
}

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

다음은 RFC 5322에 따른 전자 메일에 대한 최종 RegEx입니다. 전자 메일 주소의 기본 구문 만 확인하고 최상위 도메인이 존재하는지 확인하지 않기 때문에 사용하지 않는 것이 가장 좋습니다.

(? : [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]) +)
     \])

전자 메일 RegEx에 대한 자세한 내용은 Regular-Expressions.info 를 참조하십시오 .

Objective-C 또는 Swift와 같은 언어에서 필요로하는 탈출은 없습니다.


1
사용하는 emailRegEx는 잘못되었습니다. TLD의 길이는 2 ~ 4 자이며 도메인은 .engineer존재합니다.
Antzi

나는 내 대답을 변호하는 것이 아니라 편집 수준을 이해하고 있습니다. 위와 같이 의견을 추가하고, 투표하고, 더 나은 답변을 가리키고, 자신의 답변을 추가하십시오. 답변을 실질적으로 변경하는 것은 적절하지 않습니다. 완전성을 위해 확산 성 RegEx를 추가했습니다.
zaph

왜 오, 왜 대답을 삭제하지 않습니까? 여기에 유지해야 할 이유무엇입니까 ?
Fattie

7

나는 그것을 위해 확장을 사용하는 것을 선호합니다. 또한이 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)
    }
}

몇 가지 문제가 있습니다. 예를 들어 .. 이상한 점이있는 blah @ .abc
Fattie

5

신속한 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
        }
    }
}

1
이것은 나에게 잘 작동하는 것 같습니다. 내가 이해하는 한, .CaseInsensitive 옵션이 있으므로 'AZ'(대문자)를 생략 할 수도 있습니다.
AZOM

NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

5

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

    }

4

이것은 @Fattie의 "THE REASONABLE SOLUTION" 에 대한 새 버전 으로 Swift 4.1에서 다음과 같은 새 파일로 테스트되었습니다 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재산은보다 낫습니다 func.


2

간단한 확장명을 작성하십시오.

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등 ...


참고 NSRange길이 속성을 사용해야 String utf16.count대신characters.count
레오 버스들이시길

2

에서 스위프트 4.2 및 엑스 코드 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를 사용하려는 경우

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

1

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

예를 들어 이메일을 확인하려면 :

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

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

SwiftCop 은 도서관입니다 ... 도움이 되길 바랍니다!


1

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

alexcristea의 답변에서 Regex를 사용하도록 변경하면 완벽한 솔루션입니다.
ittgung

0

이제 이상한 최상위 도메인 이름이 너무 많기 때문에 최상위 도메인의 길이 확인을 중단합니다 ...

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

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

작동하는 것 같습니다 ...

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이 다른 솔루션보다 덜 자세한 코드를 사용하여 Swift 2.2에 대한 답변을 업데이트했습니다.

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는이 정규식으로 전달됩니다. 고쳐야합니다.
Gunhan

NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

0

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

NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

0

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

NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

0

응답 목록에 내가 추가 한 것은 Linux의 경우 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에서 모두 성공적으로 컴파일됩니다.


NSRange 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo

0

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

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

확장 프로그램을 만들고 싶습니다

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

}

용법:

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

}

0

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

그때:

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

0

Google 이메일과 같은 완벽한 정규식

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

2
내 대답을 투표하는 사람은 친절하게 당신의 지식을 확인하십시오. 나는이 정규 표현식을 많은 코드로 적용했으며 내 친구들 이이 정규 표현식을 사용하고 있으며 잘 작동합니다.
ami rt

나는 대답 할 수 있다고 생각합니다 : 정규 표현식은 단순하고 RFC와 일치하지 않습니다. 예를 들어, 이메일에는 첫 번째 부분에 따옴표와 공백이있을 수 있습니다! haacked.com/archive/2007/08/21/…
Hugal31

1
죄송합니다, 형제, 나는 당신이 Google 이메일 유효성 검사를 확인해야한다고 생각합니다. 이메일의 첫 부분에 스페이스를 추가 할 수있는 방법이 없습니다.
ami rt

RFC 5322에 따르면 "Hello world!"@ example.com은 유효한 이메일입니다. 실제로 유효한 정규 표현식을 만드는 것은 거의 불가능합니다. 모든 메일 제공 업체가 Google 이메일 확인을 준수하지는 않습니다.
Hugal31

1
그게 내가 듣고 싶은 것인데, 위의 정규 표현식이 굵은 글씨로 언급 된 이유는 Google과 같습니다. 감사합니다
ami rt

-1

또는 UITextField의 선택적 텍스트에 대한 확장명을 가질 수 있습니다.

사용하는 방법:

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

신장:

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 길이 속성은 characters.count 대신 String utf16.count를 사용해야합니다.
Leo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.