2010-07-05 4 views
2

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

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

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

Edit:

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

Благодаря

+0

Что регулярное выражение библиотеки вы используете? Какой язык программирования? –

+0

Извините, я забыл упомянуть, что xD Это Objective-C для программирования iPhone. – Yoot

+0

Помимо того факта, что сопоставление адреса электронной почты с регулярным выражением действительно сложно, нет причин, по которым нужно было бы. после @. Например, postmaster @ com, вероятно, является действительным адресом электронной почты. – JeremyP

ответ

6

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

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

+0

Да, вы правы, я просто пытаюсь сделать простую проверку, просто чтобы посмотреть, выглядит ли почта «[email protected]» с «@» и «.». – Yoot

+0

В этом случае '.. * [@] .. * [.] .. *' должен покрывать ваши потребности. Я использую '.. ​​*' для сопоставления хотя бы одного символа, потому что '. +', А более прямой, не поддерживается всеми библиотеками RegEx. Я использую '[@]' и '[.]', Потому что они будут соответствовать одному символу, без необходимости иметь дело с обратными косыми чертами и двойными обратными слэшами для экранирования одного символа. –

+0

Спасибо, что много работает с .. * [@] .. * [.] .. * – Yoot

2

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

+0

Уже пробовал, что предупреждение было отменено, но регулярное выражение все равно не работало. Попробуем регулярное выражение ниже. Спасибо – Yoot

2

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

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])? 

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

+0

не работает ... – Yoot

+0

Это не заглавные буквы? – quantumpotato

0

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

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

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

0

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

3

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

NSString* pattern = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern]; 
if ([predicate evaluateWithObject:@"[email protected]"] == YES) { 
    // Match 
} else { 
    // No Match 
} 
+0

По-прежнему та же проблема здесь с caracter "." «johndoe @ example» соответствует, но этого не должно быть. – Yoot

13

Это регулярное выражение, используемое приложением 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]; 
} 
+0

'john.doe @ yahoo' действительно с этим –

+0

Упс, хороший улов! Я забыл сбежать '.' с' \ .' Регулярное выражение теперь исправлено. – 0xced

+1

Мне очень плохо в regex, поэтому я искал «готовое к использованию» Regex. Но этот (с использованием реализации регулярного выражения NSPredicate) имеет серьезную проблему: попробуйте проверить эту строку: @ "asdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdf", и вы увидите, что это никогда не закончится. – Altimac

0

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

Мы получаем более практическую реализацию RFC 5322, если мы опустим синтаксис , используя двойные кавычки и квадратные скобки. Он по-прежнему будет соответствовать 99.99% всех адресов электронной почты в актуальном использовании сегодня. Source

[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. Он описывает синтаксис , что действительные адреса электронной почты должны придерживаться. Вы можете (но shouldn't - читайте дальше) осуществлять его с этим регулярным выражением:

(?:[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]; 

Над Regexps вы можете проверить с помощью Интернет регулярное выражение tester

Смежные вопросы