Regex для адреса электронной почты не работает - PullRequest
2 голосов
/ 05 июля 2010

Я пытаюсь проверить правильность какого-либо адреса электронной почты с помощью следующего кода:

NSPredicate *regexMail = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*@.*\..*'"];
if([regexMail evaluateWithObject:someMail])
... 

Но "\."похоже, не работает, так как почта "smith @ company" принята.Кроме того, у меня есть следующее предупреждение: «Неизвестная escape-последовательность»

Редактировать:

Я программирую в Objective-C для iPhone.

Спасибо

Ответы [ 8 ]

13 голосов
/ 14 января 2012

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

^[[:alnum:]!#$%&’*+/=?^_`{|}~-]+((\.?)[[:alnum:]!#$%&’*+/=?^_`{|}~-]+)*@[[:alnum:]-]+(\.[[:alnum:]-]+)*(\.[[:alpha:]]+)+$

А вот функция копирования / вставки, использующая это регулярное выражение для проверки адреса электронной почты в Objective-C:

BOOL IsValidEmail(NSString *email)
{
    // Regexp from -[NSString(NSEmailAddressString) mf_isLegalEmailAddress] in /System/Library/PrivateFrameworks/MIME.framework
    NSString *emailRegex = @"^[[:alnum:]!#$%&'*+/=?^_`{|}~-]+((\\.?)[[:alnum:]!#$%&'*+/=?^_`{|}~-]+)*@[[:alnum:]-]+(\\.[[:alnum:]-]+)*(\\.[[:alpha:]]+)+$";
    NSPredicate *emailPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailPredicate evaluateWithObject:email];
}
6 голосов
/ 05 июля 2010

Вы не можете правильно проверить адрес электронной почты только с помощью регулярных выражений. Простой поиск покажет вам много статей, обсуждающих это. Проблема заключается в природе DNS: существует слишком много возможных доменных имен (включая неанглийские и Unicode-домены), вы не можете правильно проверить их с помощью регулярных выражений. Не пытайся

Единственный правильный способ определить, является ли адрес электронной почты действительным, - это отправить сообщение по адресу с уникальным URL-адресом, который идентифицирует учетную запись, связанную с электронной почтой, которую пользователь может щелкнуть. Все остальное будет раздражать вашего конечного пользователя.

3 голосов
/ 05 июля 2010

Вот рабочий пример с немного более подходящим шаблоном (хотя он не идеален, как уже упоминали другие):

NSString* pattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
if ([predicate evaluateWithObject:@"johndoe@example.com"] == YES) {
  // Match
} else {
  // No Match
}
2 голосов
/ 05 июля 2010

Эта страница содержит хорошее объяснение использования регулярных выражений для проверки электронной почты, а также некоторые регулярные выражения:

http://www.regular -expressions.info / email.html

Их выражение:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Кажется, это лучший компромисс между тщательностью и правильностью.

2 голосов
/ 05 июля 2010

Полагаю, это должно быть \\., поскольку \ тоже должно быть экранировано.

0 голосов
/ 24 сентября 2015

Скопируйте и вставьте решение (я добавил заглавные буквы для первого примера):

Мы получим более практическую реализацию RFC 5322, если опустить синтаксис с использованием двойных кавычек и квадратных скобок. Это все равно будет соответствовать 99,99% всех адресов электронной почты в настоящее время используются. Источник

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
  NSString * derivedStandard = @"[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?";
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", derivedStandard];
  BOOL isValid = [predicate evaluateWithObject:emailAddress];

//doesn't fail on ;)
@"asdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdf"

Для тех, кто хочет реализовать полный RFC5322

Официальный стандарт известен как RFC 5322. Он описывает синтаксис что действительные адреса электронной почты должны придерживаться. Вы можете (но вы не следует читать дальше) реализовать это с помощью этого регулярного выражения:

(?:[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])+)\])
  NSString *rfc5322 = @"(?:[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 *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", rfc5322];
  BOOL isValid = [predicate evaluateWithObject:emailAddress];

Выше регулярных выражений вы можете проверить с помощью регулярного выражения онлайн tester

0 голосов
/ 05 июля 2010

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

0 голосов
/ 05 июля 2010

попробуйте поставить двойную косую черту вместо одной. это то, что может означать escape-последовательность Unknown.

вот сайт, который поможет вам понять, как использовать регулярные выражения: http://www.wellho.net/regex/java.html

или просто найдите подходящее регулярное выражение для адреса электронной почты здесь: http://regexlib.com/DisplayPatterns.aspx?cattabindex=0&categoryId=1

...