Проверка электронной почты с регулярным выражением VB.Net

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

Я нашел это выражение "^ [_ a-z0-9 -] + (. [_ A-z0-9 -] +) @ [a-z0-9 -] + (. [A-z0-9 -] +) ( . [az] {2,4}) $ ", но я не могу найти способ проверить, прошел ли он.

Я хочу некоторый код как:

if not txtEmail.text = regexString then
    something happens..
else
    something else happens..
end if
15.12.2008 20:07:55
Могу ли я указать вам на то, что если вы воспользуетесь Google для «vb.net regex», первая ссылка даст вам пошаговые инструкции для этого?
Svante 15.12.2008 20:20:22
Это хороший вопрос для записи на StackOverflow - я не вижу ничего плохого в том, чтобы задавать это здесь.
Jeffrey 15.12.2008 20:59:27
6 ОТВЕТОВ
РЕШЕНИЕ

Используйте System.Text.RegularExpressions.Regexкласс:

Function IsEmail(Byval email as string) as boolean
    Static emailExpression As New Regex("^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$")

    return emailExpression.IsMatch(email)
End Function

Самое важное, что нужно понять об этом ответе, это то, что я не писал регулярное выражение сам. Есть так много неправильных способов, которые кажутся правильными, и есть несколько уровней детализации, к которым вы могли бы обратиться. Например, хотите ли вы ограничить это действительными доменами верхнего уровня, и если да, то как вы учитываете тот факт, что они теперь время от времени добавляют новые TLD? Если регулярное выражение является наиболее подходящим местом для этого теста, или должен иметь отдельный код для этой проверки? Даже выражение в этом ответе теперь очень устарело, так как оно было изначально написано.

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

23
26.11.2018 15:14:25
If … Then Return True Else Return Falseбезусловно, в первой десятке анти-паттернов. : - /
Konrad Rudolph 15.12.2008 20:13:16
Да, это плохая привычка, которую я приобрел на своем последнем концерте, где политика не позволяла возвращать результаты булевых выражений напрямую. Исправить образец.
Joel Coehoorn 15.12.2008 20:16:53
Выражение нарушено. См stackoverflow.com/questions/369543/...
bzlm 15.12.2008 20:41:21
Regex для сопоставления адресов электронной почты по своей сути нарушен. Вы можете создать ощущение, что вы в значительной степени покрываете все свои базы, но, в конце концов, почти всегда будет действительный шаблон, от которого вы отказываетесь, или недопустимый, который вы разрешаете. Ваш не покрывает апострофы как действительные, но они есть.
Tomalak 15.12.2008 20:45:11
Если… Тогда Return True Иначе Return False в 10 раз удобнее для чтения, чем Return Matchobject. это то, что вы фактически делаете, то, что вы делаете выше ... вы не представляете, что такое возвращаемый тип, просто взглянув на него, вы можете получить 400 строк кода от логического значения. Читаемость превосходит ваш «идеальный образец» минималистичной потери кода… в любой день. лучшая читаемость уменьшает количество ошибок Большинство программистов, которые высокомерно относятся к своим идеальным шаблонам, как правило, имеют больше ошибок, основываясь на моем 25-летнем опыте.
hamish 26.09.2014 23:21:39

Для такого рода вещей есть отличный сайт, http://regexlib.com/ . У него есть не только приложение для тестирования, куда вы можете вставить регулярное выражение и проверить его, но также есть библиотека регулярных выражений, которую вы можете использовать с отзывами сообщества об их валидности и т. Д. Я не гуру регулярных выражений, поэтому Я иду сюда, когда мне нужно быстрое регулярное выражение.

Кроме того, если вы задумываетесь о разработке регулярных выражений самостоятельно, есть отличный инструмент под названием Regex Buddy , который позволит вам создавать и тестировать регулярные выражения на лету, используя простую для понимания интерпретацию вашего регулярного выражения на английском языке.

5
15.12.2008 20:28:10
У меня был случай, когда электронное письмо не соответствовало простому регулярному выражению выше "^ [_ a-z0-9 -] + (. [A-z0-9 -] +) @ [a-z0-9 -] + (. [A -z0-9 -] +) * ([AZ] {2,4}) $».. Вернувшись сюда, я использовал regexlib, которым Андерсон был достаточно любезен, и поделился поиском регулярных выражений «email» с самым высоким рейтингом. Было 4 хита, и этот был первым в списке и работал лучше всего для меня: "^ ((([! # $% & ' + \ - / =? ^ _ {|}~\w])|([!#$%&'*+\-/=?^_{|} ~ \ W] [! # $ % & '* + \ - / =? ^ _ {|}~\.\w]{0,}[!#$%&'*+\-/=?^_{|} ~ \ w])) [@] \ w + ([-.] \ w +) * \. \ w + ([-.] \ w +) ) $ " исходная и тестовая страница здесь: regexlib.com/RETester.aspx?regexp_id=2558
Jeff Mergler 22.08.2017 16:19:32

Это регулярное выражение на самом деле не завершено ... на самом деле ... большинство не является (проверить эту статью или эту ).

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

2
15.12.2008 20:33:07
Не могли бы вы рассказать всем, как правильно проверить адрес электронной почты в .net?
Antonio Leite 10.01.2013 09:41:41

Адрес электронной почты: RFC 2822 (упрощенный) Соответствует обычному адресу электронной почты. Не проверяет домен верхнего уровня. Требует, чтобы опция «без учета регистра» была включена.

Dim FoundMatch As Boolean
Try
    FoundMatch = Regex.IsMatch(txtEmail.text, "\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase)
Catch ex As ArgumentException
    'Syntax error in the regular expression
End Try

If Not FoundMatch Then
   Error = True
Else
   Error = False
End If
-2
15.12.2008 20:39:47
Выражение не работает (например, не разрешает tld-only-address). См stackoverflow.com/questions/369543/...
bzlm 15.12.2008 20:43:50
Пример не сломан. Он не проверяет домены верхнего уровня. Как я уже упоминал в своем комментарии. Смотрите мой другой комментарий для того, который делает.
Mick 15.12.2008 20:57:06
Я никогда не пойму, почему кто-то напишет заявление IF, как ваше последнее в этом фрагменте. Это просто безумие. Должно быть: Error = Not FoundMatch
Josh Stodola 3.06.2009 17:22:04
Да, это было бы короче. Я собирался для общей ясности. Итак, теперь вы знаете, почему кто-то может написать утверждение IF, подобное последнему в этом фрагменте :-)
Mick 3.06.2009 21:04:57

Выберите свое любимое регулярное выражение из моей статьи о сопоставлении адресов электронной почты с регулярным выражением и вставьте его в этот код Visual Basic:

If Regex.IsMatch(SubjectString, "regex") Then
    Error = False
Else
    Error = True
End If

Лучшее регулярное выражение для сопоставления с адресом электронной почты - спорная тема, в которую я не хочу вдаваться. В моей статье обсуждаются проблемы, о которых вы должны знать при выборе регулярных выражений. Регулярное выражение в ответе Джоэла Кохорна определенно не очень хорошее.

6
17.12.2008 15:00:49
Хорошее описание различных компромиссов на связанной веб-странице.
WileCau 21.02.2009 14:01:36

Возможно, не по теме, поскольку это не решение регулярных выражений, но вы можете просто использовать некоторые из встроенных функций .NET 2.0:

try
{
   MailAddress email = new MailAddress(txtEmail.Text);
}
catch(FormatException fe)
{
   // output error
}
5
6.02.2009 19:47:32
Это повсюду в проекте, над которым я сейчас работаю, и я его разрываю. Я не понимаю, как выбрасывание исключения - это хорошая логика или метод проверки, кроме всего прочего, это дорогостоящая задача. Не стесняйтесь поправлять меня
matt_lethargic 1.05.2014 14:00:37
Мне было трудно заставить это сломаться, я пропустил все виды мусорных писем, и они сожрали их без исключения, и я удалил это из своего кода.
Jeff Mergler 22.08.2017 16:27:49