Email validation on textField in iOS - ios

In iOS App, how to add Email validation on UITextField?

Use NSPredicate and Regex:
- (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];
}
For a bunch of emails separated by a comma:
- (NSMutableArray*)validateEmailWithString:(NSString*)emails
{
NSMutableArray *validEmails = [[NSMutableArray alloc] init];
NSArray *emailArray = [emails componentsSeparatedByString:#","];
for (NSString *email in emailArray)
{
NSString *emailRegex = #"[A-Z0-9a-z._%+-]+#[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailRegex];
if ([emailTest evaluateWithObject:email])
[validEmails addObject:email];
}
return [validEmails autorelease];
}
Edited Answer: (It also validates extra dots )
- (BOOL)validateEmailWithString:(NSString*)checkString
{
BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
NSString *stricterFilterString = #"[A-Z0-9a-z\\._%+-]+#([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}";
NSString *laxString = #".+#([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*";
NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailRegex];
return [emailTest evaluateWithObject:checkString];
}

Try this out
This checks exactly with top level domain names along with validation.
- (BOOL)validateEmail:(NSString *)inputText {
NSString *emailRegex = #"[A-Z0-9a-z][A-Z0-9a-z._%+-]*#[A-Za-z0-9][A-Za-z0-9.-]*\\.[A-Za-z]{2,6}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailRegex];
NSRange aRange;
if([emailTest evaluateWithObject:inputText]) {
aRange = [inputText rangeOfString:#"." options:NSBackwardsSearch range:NSMakeRange(0, [inputText length])];
int indexOfDot = aRange.location;
//NSLog(#"aRange.location:%d - %d",aRange.location, indexOfDot);
if(aRange.location != NSNotFound) {
NSString *topLevelDomain = [inputText substringFromIndex:indexOfDot];
topLevelDomain = [topLevelDomain lowercaseString];
//NSLog(#"topleveldomains:%#",topLevelDomain);
NSSet *TLD;
TLD = [NSSet setWithObjects:#".aero", #".asia", #".biz", #".cat", #".com", #".coop", #".edu", #".gov", #".info", #".int", #".jobs", #".mil", #".mobi", #".museum", #".name", #".net", #".org", #".pro", #".tel", #".travel", #".ac", #".ad", #".ae", #".af", #".ag", #".ai", #".al", #".am", #".an", #".ao", #".aq", #".ar", #".as", #".at", #".au", #".aw", #".ax", #".az", #".ba", #".bb", #".bd", #".be", #".bf", #".bg", #".bh", #".bi", #".bj", #".bm", #".bn", #".bo", #".br", #".bs", #".bt", #".bv", #".bw", #".by", #".bz", #".ca", #".cc", #".cd", #".cf", #".cg", #".ch", #".ci", #".ck", #".cl", #".cm", #".cn", #".co", #".cr", #".cu", #".cv", #".cx", #".cy", #".cz", #".de", #".dj", #".dk", #".dm", #".do", #".dz", #".ec", #".ee", #".eg", #".er", #".es", #".et", #".eu", #".fi", #".fj", #".fk", #".fm", #".fo", #".fr", #".ga", #".gb", #".gd", #".ge", #".gf", #".gg", #".gh", #".gi", #".gl", #".gm", #".gn", #".gp", #".gq", #".gr", #".gs", #".gt", #".gu", #".gw", #".gy", #".hk", #".hm", #".hn", #".hr", #".ht", #".hu", #".id", #".ie", #" No", #".il", #".im", #".in", #".io", #".iq", #".ir", #".is", #".it", #".je", #".jm", #".jo", #".jp", #".ke", #".kg", #".kh", #".ki", #".km", #".kn", #".kp", #".kr", #".kw", #".ky", #".kz", #".la", #".lb", #".lc", #".li", #".lk", #".lr", #".ls", #".lt", #".lu", #".lv", #".ly", #".ma", #".mc", #".md", #".me", #".mg", #".mh", #".mk", #".ml", #".mm", #".mn", #".mo", #".mp", #".mq", #".mr", #".ms", #".mt", #".mu", #".mv", #".mw", #".mx", #".my", #".mz", #".na", #".nc", #".ne", #".nf", #".ng", #".ni", #".nl", #".no", #".np", #".nr", #".nu", #".nz", #".om", #".pa", #".pe", #".pf", #".pg", #".ph", #".pk", #".pl", #".pm", #".pn", #".pr", #".ps", #".pt", #".pw", #".py", #".qa", #".re", #".ro", #".rs", #".ru", #".rw", #".sa", #".sb", #".sc", #".sd", #".se", #".sg", #".sh", #".si", #".sj", #".sk", #".sl", #".sm", #".sn", #".so", #".sr", #".st", #".su", #".sv", #".sy", #".sz", #".tc", #".td", #".tf", #".tg", #".th", #".tj", #".tk", #".tl", #".tm", #".tn", #".to", #".tp", #".tr", #".tt", #".tv", #".tw", #".tz", #".ua", #".ug", #".uk", #".us", #".uy", #".uz", #".va", #".vc", #".ve", #".vg", #".vi", #".vn", #".vu", #".wf", #".ws", #".ye", #".yt", #".za", #".zm", #".zw", nil];
if(topLevelDomain != nil && ([TLD containsObject:topLevelDomain])) {
//NSLog(#"TLD contains topLevelDomain:%#",topLevelDomain);
return TRUE;
}
/*else {
NSLog(#"TLD DOEST NOT contains topLevelDomain:%#",topLevelDomain);
}*/
}
}
return FALSE;
}

Use the below code:-
NSString *emailRegEx = #"[A-Z0-9a-z._%+-]+#[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailRegEx];
//Valid email address
if ([emailTest evaluateWithObject:userMailTextField.text] == YES)
{
//Do Something
}
else
{
NSLog(#"email not in proper format");
}
userMailTextField is the name of my textField (use your own).
I hope this code will help you!!!

Use Below code for "Swift language" For Email Validation
func ValidateEmailString (strEmail:NSString) -> Bool
{
let emailRegex = "[A-Z0-9a-z._%+-]+#[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailText = NSPredicate(format:"SELF MATCHES [c]%#",emailRegex)
return (emailText.evaluate(with: strEmail))
}
Thanks :)

NSRegularExpression is the Best Way to Validate Email Addresses with iOS 4.x and Later.
-(BOOL) validateEmail:(NSString*) emailString
{
NSString *regExPattern = #"^[A-Z0-9._%+-]+#[A-Z0-9.-]+\\.[A-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;
}
Usage :
if([self validateEmail:#"something#domain.com"]) {
//Email Address is valid.
}
else {
//Email Address is invalid.
}

- (BOOL)validateEmailAddress:(NSString*)yourEmail
{
//create a regex string which includes all email validation
NSString *emailRegex = #"[A-Z0-9a-z._%+-]+#[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
//create predicate with format matching your regex string
NSPredicate *email = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailRegex];
//return True if your email address matches the predicate just formed
return [email evaluateWithObject:yourEmail];`
}

--it's easy to validate your email id by calling validateEmail method:
-(BOOL)validateEmail:(NSString *)email
{
NSString *emailRegex = #"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*#(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailRegex];
return [emailTest evaluateWithObject:email];
}
Verify your email id here....
BOOL eb=[self validateEmail:**youremailtextfield**];
if(!eb)
{
UIAlertView *alertsuccess = [[UIAlertView alloc] initWithTitle:#"Sorry" message:#"Please enter correct email id"
delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil, nil];
[alertsuccess show];
[alertsuccess release];
}

Here the simple way to validate email in obj c
if(![self validEmail:self.emailTxtFld.text]) {
// here show alert not a valid email id
}
here valid email id method is
- (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])];
if (regExMatches == 0) {
return NO;
} else {
return YES;
}
}
In Swift 3.0 Version
if !validEmailId(inputText: userNameTxtFld.text!) {
print("Not Valid Emaild")
}
else {
print("valid email id")
}
func validEmailId(inputText: String)-> Bool {
print("validate emilId: \(inputText)")
let emailRegEx = "^(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?(?:(?:(?:[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+(?:\\.[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+)*)|(?:\"(?:(?:(?:(?: )*(?:(?:[!#-Z^-~]|\\[|\\])|(?:\\\\(?:\\t|[ -~]))))+(?: )*)|(?: )+)\"))(?:#)(?:(?:(?:[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])?)*)|(?:\\[(?:(?:(?:(?:(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))\\.){3}(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))))|(?:(?:(?: )*[!-Z^-~])*(?: )*)|(?:[Vv][0-9A-Fa-f]+\\.[-A-Za-z0-9._~!$&'()*+,;=:]+))\\])))(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?$"
let emailTest = NSPredicate(format:"SELF MATCHES %#", emailRegEx)
let result = emailTest.evaluate(with: inputText)
return result
}

This works exactly
-(BOOL) emailValidation:(NSString *)emailTxt
{
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:emailTxt];
}

perfect validation for email. try this.
- (BOOL)validateEmailWithString:(NSString*)checkString
{
NSString *laxString = #".+#([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", laxString];
return [emailTest evaluateWithObject:checkString];
}

I'm author of DCKit library, which has DCMandatoryEmailTextField. This class does email validation automatically and highlights/unhighlights the text field when the user is typing a value:
Check it out: https://github.com/andrew8712/DCKit

Swift
func validateEmail(email:String) -> Bool {
let stricterFilter = false
let stricterFilterString = "[A-Z0-9a-z\\._%+-]+#([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}"
let laxString = ".+#([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*";
let emailRegex = stricterFilter ? stricterFilterString : laxString
let emailTest = NSPredicate(format: "SELF MATCHES %#", emailRegex)
return emailTest.evaluate(with: email);
}

Function:
- (BOOL)validateEmail:(NSString *)enteredEmailID
{
//checking valid email id or not
NSString *emailReg = #"[A-Z0-9a-z._%+-]+#[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", emailReg];
return [emailTest evaluateWithObject:enteredEmailID];
}
Call it like:
if ([self validateEmail: textField.text])
{
//NSLog(#"Valid Email");
}
else
{
//NSLog(#"Invalid Email");
}
EDIT:
You can do this into textfield did end editing delegates or textfield should character change delegates

A version using NSRegularExpression and regex pattern copied from OWASP_Validation_Regex_Repository
+ (BOOL) isValidEmail:(NSString *)emailString {
NSError *error = NULL;
/**
* #see OWASP_Validation_Regex_Repository
*/
NSString *emailPattern = #"^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*#(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:emailPattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSUInteger matchCount = [regex numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];
return matchCount > 0;
}

Related

RegEx validation of techmahindra account

I want to validate for textfield of email and wants to find out is it techmahindra email or not. How can I find it . I am attaching my code here.
Could any one suggest changes.
NSString * myString = # "#";
NSArray * myWords = [emailStr componentsSeparatedByString: myString];
NSString * str = [myWords objectAtIndex: 1];
if ([str isEqualToString: # "techmahindra.com"]) {
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: emailStr];
} else
return NO;
Given that you have written code to extract the part of the string that follows the # symbol, you don't need regular expressions there. You can simply do a case-insensitive comparison, like this:
if (str != nil && [str compare:#"techmahindra.com" options:NSCaseInsensitiveSearch]) {
return [emailTest evaluateWithObject:emailStr];
}
else
return NO;
You probably should also trim whitespace as part of your email validation code as this check will fail if there is a trailing space for example.

Regexp matching group not working on objective-c

I'm trying to get from this string: 5556007503140005
Two strings. "555600750314" and "0005"
I'm Using the regexp ^([a-z0-9]*)([0-9]{4})$that works fine on the regexp tools, but when i use this on my code I only get 1 match.
this is the code
-(NSDictionary *)parse_barcode:(NSString *)barcode {
NSString *regexp = #"^([a-z0-9]*)([0-9]{4})$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"SELF MATCHES %#",regexp];
if ([predicate evaluateWithObject:barcode]) {
NSError *error;
NSRegularExpression *regular_exp = [NSRegularExpression regularExpressionWithPattern:regexp options:0 error:&error];
NSArray *matches = [regular_exp matchesInString:barcode options:0 range:NSMakeRange(0, [barcode length])];
for (NSTextCheckingResult *match in matches) {
NSLog(#"match %# :%#",[barcode substringWithRange:[match range]], match);
}
}
return nil;
}
But the match is always the entire string (Barcode)
You get the right match, you are just not printing them correctly. You need to use numberOfRanges to get the individual groups (i.e. sections enclosed in parentheses), and then call rangeAtIndex: for each group, like this:
for (NSTextCheckingResult *match in matches) {
for (int i = 0 ; i != match.numberOfRanges ; i++) {
NSLog(#"match %d - %# :%#", i, [barcode substringWithRange:[match rangeAtIndex:i]], match);
}
}

Validating strings against given regex pattern?

I wrote simple method for checking if given array has at least one string, that matches provided pattern... but something is missing and not sure how to limit positive results only to full words, not just first substring that fits pattern.
+ (BOOL)hasWordsWithPattern:(NSString *)pattern inWords:(NSArray *)words{
NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionCaseInsensitive
error:nil];
for (NSString *s in words) {
if ([expression matchesInString:s
options:0
range:NSMakeRange(0, s.length)]) {
NSLog(#"there is a match!");
return YES;
}
}
NSLog(#"sorry, no match found!");
return NO;
}
Silly me, there is easier way to do that :) based on https://stackoverflow.com/a/5777016/1015049
+ (BOOL)hasWordsWithPattern:(NSString *)pattern inWords:(NSArray *)words{
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", pattern];
for (NSString *s in words) {
if ([predicate evaluateWithObject:s]) {
NSLog(#"there is a match!");
return YES;
}
}
NSLog(#"sorry, no match found!");
return NO;
}

Find and detect "#" and "#" with NSRegularExpression

I am trying to find "#" and "#" sign in my text with NSRegularExpression like that;
NSString *testString = #"This text contains # and # signs";
NSRange stringRange = NSMakeRange(0, [testString length]);
NSRegularExpression *regexTest = [[NSRegularExpression alloc] initWithPattern:#"\\b(#|#)\\b"];
NSRange nameRange = [regexTest rangeOfFirstMatchInString:testString options:0 range:stringRange];
When i NSLog nameRange.location, it's always return 0. What is the correct form to find that signs with NSRegularExpression?
This is how I did it using NSPredicate. This tells you the current #mention word that's being edited/typed. Hope this helps.
- (void)textViewDidChange:(UITextView *)textView
{
_words = [self.textView.text componentsSeparatedByString:#" "];
NSPredicate* predicate = [NSPredicate predicateWithFormat:#"SELF BEGINSWITH[cd] '#'"];
NSArray* names = [_words filteredArrayUsingPredicate:predicate];
if (_oldArray)
{
NSMutableSet* set1 = [NSMutableSet setWithArray:names];
NSMutableSet* set2 = [NSMutableSet setWithArray:_oldArray];
[set1 minusSet:set2];
if (set1.count > 0)
NSLog(#"Results %#", set1);
}
_oldArray = [[NSArray alloc] initWithArray:names];
}

NSPredicate for mobile number validation

How to validate a phone number (NSString *) by NSPredicate?
Rules:
minimum 10 digits
maximum 10 digits
the first digit must be 7,8 or 9
Thanks
An NSPredicate based on a regular expression will fit your requirements.
NSString *stringToBeTested = #"8123456789";
NSString *mobileNumberPattern = #"[789][0-9]{9}";
NSPredicate *mobileNumberPred = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", mobileNumberPattern];
BOOL matched = [mobileNumberPred evaluateWithObject:stringToBeTested];
You don't need to keep the pattern in a string by itself, but regexes are complicated enough already so it makes the overall code clearer if you keep it out of the NSPredicate format string.
You can just use below code
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
{
if(textField.tag == 111)
{
if([self MobileNumberValidate:string] == TRUE)
return YES;
else
return NO;
}
return YES;
}
#pragma mark - Mobile Number validation
- (BOOL)MobileNumberValidate:(NSString*)number
{
NSString *numberRegEx = #"[0-9]";
NSPredicate *numberTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", numberRegEx];
if ([numberTest evaluateWithObject:number] == YES)
return TRUE;
else
return FALSE;
}
NSString *phoneNumber = #"1234567890";
NSString *phoneRegex = #"[789][0-9]{3}([0-9]{6})?";
NSPredicate *test = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", phoneRegex];
BOOL matches = [test evaluateWithObject:phoneNumber];
Below code will work for your requirement:
Function:
-(BOOL)validatePhone:(NSString *)enteredPhoneNumber
{
NSString *phoneRegex = #"[789][0-9]{9}";
// OR below for advanced type
//NSString *phoneRegex = #"^((\\+)|(00))[0-9]{6,14}$";
NSPredicate *phoneTest = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", phoneRegex];
return [phoneTest evaluateWithObject:enteredPhoneNumber];
}
Call it:
if ([self validatePhone:#"9833112299"])
{
NSLog(#"Valid Phone Number");
}
else
{
NSLog(#"Invalid Phone Number");
}
Make it Global using 'extension' use it wherever required
In any one of your view controller class at the end after last } paste below code
extension String
{
func validateMobile() -> Bool
{
return NSPredicate(format: "SELF MATCHES %#","[789][0-9].{9}").evaluate(with: self)
}
}
when you want to validate yourTxtField in any ViewController class simply call as below:
if (yourTxtField.text?.validateMobile())!
{
print("It is 10 digit, starting with 7/8/9")
}
else
{
print("Invalid mobile number")
}

Resources