12

I am trying to put validation in text field containing email address.
What is to be added in string "emailRegEx" to limit the user from inserting three dots in email address or what I have to write in method for same.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string. 

Here is my code:

- (BOOL)EmailValidationL:(NSString *)email
{
    NSString *emailRegEx =@"(?:[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])+)\\])";

    NSPredicate *regExPredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegEx];
    a= [regExPredicate evaluateWithObject:email];
    return a;
}
boraseoksoon
  • 2,164
  • 1
  • 20
  • 25
Ketan Shinde
  • 1,847
  • 4
  • 18
  • 38
  • possible duplicate of [Best practices for validating email address in Objective-C on iOS 2.0?](http://stackoverflow.com/questions/800123/best-practices-for-validating-email-address-in-objective-c-on-ios-2-0) – zpasternack Feb 16 '12 at 04:43
  • @zpasternack: i want to validate dynamically , that user should not enter 3rd dot.if it enters then replace it by null string.Above method is validating in ShouldEndEditing-method – Ketan Shinde Feb 16 '12 at 06:08
  • Now that we have UTF-8 domain names, how does this change these regular expressions? e.g. camtasia教程网.com – Reid Ellis Nov 22 '13 at 05:36
  • Many of the answers here will prevent valid email addresses from being accepted. There are now many top level domains longer than four characters (see list at [https://data.iana.org/TLD/tlds-alpha-by-domain.txt]) and millions of users with email accounts on those domains. – RobP Jul 02 '20 at 00:32

6 Answers6

18

There are better ways to validate an email address.

- (BOOL)validateEmailWithString:(NSString*)email
{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
    return [emailTest evaluateWithObject:email];
}
Community
  • 1
  • 1
sch
  • 27,436
  • 3
  • 68
  • 83
  • i want to validate dynamically , that user should not enter 3rd dot.if it enters then replace it by null string, Above method is validating in ShouldEndEditing-method – Ketan Shinde Feb 16 '12 at 06:08
8
NSString *emailReg = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailReg];

if ([emailTest evaluateWithObject:yourtextFieldName.text] == NO) 
{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"enter the Valid Mail id" message:@"Please Enter Valid Email Address." delegate:nil cancelButtonTitle:@"okay" otherButtonTitles:nil];
[alert show];

}

Swift

 var emailReg: String = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
var emailTest: NSPredicate = NSPredicate(format: "SELF MATCHES %@", emailReg)

if emailTest.evaluateWithObject(yourtextFieldName.text!) == false {
var alert: UIAlertView = UIAlertView(title: "enter the Valid Mail id", message: "Please Enter Valid Email Address.", delegate: nil, cancelButtonTitle: "okay", otherButtonTitles: "")
alert.show()
}

Swift3

let emailReg = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format: "SELF MATCHES %@", emailReg)
if emailTest.evaluate(withObject: yourtextFieldName.text) == false {
 UIAlertView(title: "enter the Valid Mail id", message: "Please Enter Valid Email Address.", delegate: nil, cancelButtonTitle: "okay", otherButtonTitles: "").show()
 }
Anbu.Karthik
  • 82,064
  • 23
  • 174
  • 143
5

This regex will limit the user from inserting three dots in email address (or any number of consecutive dots), such as

username@example...com

Another rule with dot is the username and domain must not begin or end with dot, such as

.username.@.example.com

Many regexes in the internet allow invalid email addresses. Before adopting one, you might want to try testing it with some invalid email addresses, to see if they get rejected. You can use the two examples I mention here as a start.

- (BOOL)isValidEmail:(NSString *)email
{
    NSString *regex1 = @"\\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,4}\\z";
    NSString *regex2 = @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*";
    NSPredicate *test1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex1];
    NSPredicate *test2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
    return [test1 evaluateWithObject:email] && [test2 evaluateWithObject:email];
}

See validate email address using regular expression in Objective-C.

Geek
  • 413
  • 6
  • 4
  • Thanks for this, your `regex1` test saved me a lot of hassle by limiting multiple dots. Thanks again! – rosshump Oct 29 '14 at 09:28
5

iOS already has built-in data detectors for a number of different data types. Although email isn't one of those types, an email address falls under the subtype of a link. Knowing that, it's easy to check for an email address:

NSError *error = nil;
NSDataDetector *detector = 
   [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];

NSString *string = @"johndoe@gmail.com";
[detector enumerateMatchesInString:string
                           options:kNilOptions
                             range:NSMakeRange(0, [string length])
                        usingBlock:^(NSTextCheckingResult *result, 
                                     NSMatchingFlags flags, BOOL *stop) 
{
  if([result.URL.absoluteString rangeOfString:@"mailto:"].location != NSNotFound)
  {
    NSLog(@"Match: %@", result);
  }
}];

Matt Thompson's NSHipster blog has an excellent article on NSDataDetector and its useage.

memmons
  • 40,222
  • 21
  • 149
  • 183
3

you can do it by using the extension of String

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

now you can use it as

if emailtext.isEmail {  
  print("email is valid")    
} else {
  print("email is not valid") 
}
aturan23
  • 4,798
  • 4
  • 28
  • 52
Ram
  • 961
  • 6
  • 14
0

building on memmons' answer, the following code should validate an entire email string assuming we can trust NSDataDetector

- (BOOL)isPlausibleEmailAddress
{   
    NSError *error = nil;
    NSDataDetector *detector =
    [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];

    NSRange matchRange = [detector rangeOfFirstMatchInString:self options:kNilOptions range:NSMakeRange(0, [self length])];

    return matchRange.length == [self length];
} 
Community
  • 1
  • 1
bneil
  • 1,590
  • 3
  • 16
  • 26