Last active
March 13, 2018 10:45
-
-
Save jaderfeijo/afee44a28edb734c3789db38ded4a710 to your computer and use it in GitHub Desktop.
String+EmailValidation.swift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // String+EmailValidation.swift | |
| // Created by: Jader Feijo | |
| // | |
| import Foundation | |
| extension String { | |
| var isValidEmail: 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.firstMatch(in: self, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil | |
| } catch { | |
| return false | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // StringEmailValidationTests.swift | |
| // Created by: Jader Feijo | |
| // | |
| import XCTest | |
| class StringValidationTests: XCTestCase { | |
| func testIsValidEmail() { | |
| // valid emails from http://codefool.tumblr.com/post/15288874550/list-of-valid-and-invalid-email-addresses | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| // valid emails from https://en.wikipedia.org/wiki/Email_address | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("admin@mailserver1".isValidEmail) // local domain name with no TLD | |
| XCTAssertTrue("#!$%&'*+-/=?^_`{}|[email protected]".isValidEmail) | |
| XCTAssertTrue("example@localhost".isValidEmail) // sent from localhost | |
| XCTAssertTrue("[email protected]".isValidEmail) | |
| XCTAssertTrue("user@localserver".isValidEmail) | |
| XCTAssertTrue("user@tt".isValidEmail) | |
| // invalid emails http://codefool.tumblr.com/post/15288874550/list-of-valid-and-invalid-email-addresses | |
| XCTAssertFalse("plainaddress".isValidEmail) | |
| XCTAssertFalse("#@%^%#$@#$@#.com".isValidEmail) | |
| XCTAssertFalse("@example.com".isValidEmail) | |
| XCTAssertFalse("Joe Smith <[email protected]>".isValidEmail) | |
| XCTAssertFalse("email.example.com".isValidEmail) | |
| XCTAssertFalse("email@[email protected]".isValidEmail) | |
| XCTAssertFalse("あいうえお@example.com".isValidEmail) | |
| XCTAssertFalse("[email protected] (Joe Smith)".isValidEmail) | |
| XCTAssertFalse("[email protected]".isValidEmail) | |
| XCTAssertFalse("[email protected]".isValidEmail) | |
| XCTAssertFalse("\"(),:;<>[\\]@example.com".isValidEmail) | |
| XCTAssertFalse("just\"not\"[email protected]".isValidEmail) | |
| XCTAssertFalse("this\\ is\"really\"not\\[email protected]".isValidEmail) | |
| // invalid emails from https://en.wikipedia.org/wiki/Email_address | |
| XCTAssertFalse("Abc.example.com".isValidEmail) // no @ character | |
| XCTAssertFalse("A@b@[email protected]".isValidEmail) // only one @ is allowed outside quotation marks | |
| XCTAssertFalse("a\"b(c)d,e:f;g<h>i[j\\k][email protected]".isValidEmail) // none of the special characters in this local-part are allowed outside quotation marks | |
| XCTAssertFalse("just\"not\"[email protected]".isValidEmail) // quoted strings must be dot separated or the only element making up the local-part | |
| XCTAssertFalse("this is\"not\\[email protected]".isValidEmail) // spaces, quotes, and backslashes may only exist when within quoted strings and preceded by a backslash | |
| XCTAssertFalse("this\\ still\\\"not\\\\[email protected]".isValidEmail) // even if escaped (preceded by a backslash), spaces, quotes, and backslashes must still be contained by quotes | |
| XCTAssertFalse("[email protected]".isValidEmail) // double dot after @ | |
| // other invalid emails | |
| XCTAssertFalse("".isValidEmail) | |
| XCTAssertFalse(".".isValidEmail) | |
| XCTAssertFalse("@".isValidEmail) | |
| XCTAssertFalse(".@.".isValidEmail) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment