2012-06-20 2 views
1

У меня есть два регулярных выражения, как для проверки электронной почты. Первый из валидатора регулярных выражений электронной почты ASP.NET, а второй - на SO. Мой вопрос в чем разница между ними, а какая лучше?Два варианта регулярных выражений для проверки электронной почты

/^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/ 

/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/ 

Оба регулярные выражения позволяют ukkkk

<script type="text/javascript"> 

var regex = /^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; 
var regex2 = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 

alert(regex.test('[email protected]')); 
alert(regex2.test('[email protected]')); 

</script> 
+0

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

+0

Только один разрешает '1234 @ hello.com' или' 123 @ 123.123', являются ли они действительными электронными письмами? –

ответ

1

Фактически, оба они не идеальны.

Давайте сделаем их лучше: поскольку [a-zA-Z0-9_] и \w такие же, мы используем второй вариант.
Есть домены уровня уровня, такие как travel, поэтому мы увеличим максимальную длину, но, конечно, мы не будем использовать *, как в первом регулярном выражении.
В конце концов, во втором регулярном выражении есть ошибка - не должно быть последнего плюса. Нам нужен домен первого уровня, но только один.

Вот результат: ^([\w\.\-\+])+\@(([\w\-])+\.)+([a-zA-Z0-9]{2,6})$

Во всяком случае, [email protected] действует электронная почта, даже если она не существует.

И кто-нибудь знает: существуют ли домены более высокого уровня до 6 символов?

ОБНОВЛЕНИЕ: Here - отличная статья об утверждении электронной почты в соответствии с RFC-стандартом. Окончательный вариант впечатляет.

+3

Не будьте так поспешны в [ограничении TLD до 6 символов!] (Http://newgtlds.icann.org/en/program-status/application-results/strings-1200utc-13jun12-en) –

+0

Ничего себе! Большое спасибо! 'ALLFINANZBERATUNG' и некоторые другие потрясающие. :) Я думаю, можно сходить с ума, пытаясь удовлетворить _all_ требования проверки электронной почты. В этом случае мы не думали о максимальной длине 256 символов, не проверяли его на символы Unicode и т. Д. Но кому-то это нужно в реальном приложении? – Smileek

+0

В любом случае, мы можем использовать '[a-zA-Z0-9] {2,}' (или, возможно, '[a-zA-Z] {2,}'), чтобы сделать еще один маленький шаг к RFC 2822. – Smileek

1

«Лучше» является довольно субъективным - это зависит от того, что именно вы ищете.

Первое регулярное выражение допускает символ одиночной кавычки в первой части адреса электронной почты и использует \ w +, который включает символы подчеркивания, поэтому он более инклюзивный, если вы используете это как один из ваших критериев для «лучшего».

Второй не использует подчеркивания везде, где первый делает, но это тривиально, поскольку в доменах верхнего уровня нет подчеркиваний. Он также медленнее, так как {2,4}+$/ разбивает конец адреса на группы по 2, 3 или 4, пока он не станет «правильным». Он должен быть изменен на {2,})$, чтобы работать быстрее.

В конечном счете, это сойдет на то, что вы хотите считать действительным адресом электронной почты.

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