Проверка адреса электронной почты в UITextField

Я пытаюсь поместить проверку в текстовое поле, содержащее адрес электронной почты.
Что нужно добавить в строку "emailRegEx", чтобы ограничить пользователя от вставки трех точек в адрес электронной почты или того, что мне нужно написать в методе для того же.

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

Вот мой код:

- (BOOL)EmailValidationL:(NSString *)email
{
    NSString *emailRegEx [email protected]"(?:[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;
}

Ответ 1

Для подтверждения адреса электронной почты существуют способы.

- (BOOL)validateEmailWithString:(NSString*)email
{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
    return [emailTest evaluateWithObject:email];
}

Ответ 2

NSString *emailReg = @"[A-Z0-9a-z._%+-][email protected][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._%+-][email protected][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._%+-][email protected][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()
 }

Ответ 3

Это регулярное выражение ограничит пользователя введением трех точек в адрес электронной почты (или любое количество последовательных точек), например

[email protected]

Другое правило с точкой - это имя пользователя, и домен не должен начинаться или заканчиваться точкой, например

[email protected]

Многие регулярные выражения в Интернете допускают неправильные адреса электронной почты. Перед тем, как принять его, вы можете попробовать протестировать его с помощью некоторых недействительных адресов электронной почты, чтобы узнать, отклоняются ли они. Вы можете использовать два примера, которые я упоминаю здесь как начало.

- (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];
}

См. подтверждение адреса электронной почты с использованием регулярного выражения в Objective-C.

Ответ 4

iOS уже имеет встроенные детекторы данных для нескольких разных типов данных. Хотя адрес электронной почты не является одним из этих типов, адрес электронной почты подпадает под подтип ссылки. Зная это, легко проверить адрес электронной почты:

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

NSString *string = @"[email protected]";
[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 NSHipster есть отличная статья о NSDataDetector и ее использовании.

Ответ 5

на memmons ', следующий код должен проверять всю строку письма, предполагая, что мы может доверять 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];
} 

Ответ 6

вы можете сделать это, используя расширение String

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

теперь вы можете использовать его как

emailtext.isEmail {

    print("email is valid")    
} else {

 print("email is not valid") 
}