Skip to content

Instantly share code, notes, and snippets.

@jaderfeijo
Last active March 13, 2018 10:45
Show Gist options
  • Select an option

  • Save jaderfeijo/afee44a28edb734c3789db38ded4a710 to your computer and use it in GitHub Desktop.

Select an option

Save jaderfeijo/afee44a28edb734c3789db38ded4a710 to your computer and use it in GitHub Desktop.
String+EmailValidation.swift
//
// 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
}
}
}
//
// 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