2009-08-12 3 views
1

Можно создать дубликат:
What is the best regular expression for validating email addresses?Регулярное выражение для электронной почты

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

"^[A-Za-z0-9](([a-zA-Z0-9,=\.!\-#|\$%\^&\*\+/\?_`\{\}~]+)*)@(?:[0-9a-zA-Z-]+\.)+[a-zA-Z]{2,9}$" 

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

а. @ B.com должен быть недействительным

Заранее спасибо -Rollin

+3

(1) Тема регулярных выражений адреса электронной почты обсуждалась около миллиона раз, и (2) Что заставляет вас думать о "." до того, как «@» не является законным? –

+1

Вы всегда можете использовать официальное регулярное выражение RFC822: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html – ceejayoz

+2

@ Андрей: Во-первых, RFC 5322 говорит «.». перед тем, как «@» не является законным ... http://en.wikipedia.org/wiki/E-mail_address –

ответ

1

вы могли бы поставить [^\.] перед @ так, что позволит любому символу, кроме точки

, конечно, это, вероятно, не то, что вы хотите, чтобы вы могли просто поставить [] с любыми юридическими символами в нем

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

+0

Простая, но блестящая идея! Вот что я придумал. Я думаю, что это должно сработать. ^ ([A-Za-z0-9] | [A-Za-z0-9] (([a-zA-Z0-9, = \.! \ - # | \ $% \^& \ * \ ? +/\ _ '\ {\} ~] +) *) [A-Za-Z0-9 = \ - # |! \ $% \^& \ * \ +/\ _' \ {\}? ~]) @ (?: [0-9a-zA-Z -] + \.) + [A-zA-Z] {2,9} $ PS: Есть идеи по сокращению? – AgentHunt

7

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

Edit: Учитывая дополнительную информацию, что это на .NET, я хотел бы использовать MailAddress класс и отказаться от мысли с помощью регулярных выражений в целом примерно так:

public bool IsAddressValid(string text) 
{ 
    try 
    { 
     MailAddress address = new MailAddress(text); 
     return true; 
    } 
    catch (FormatException) 
    { 
     return false; 
    } 
} 

Если есть дополнительные требования в течение и, прежде чем проверять сам адрес (например, убедиться, что он принадлежит определенному набору доменов или некоторым таким), вы можете сделать это с помощью более простых тестов после того, как вы подтвердите, что адрес действителен как I suggested in another post.

+0

Я использую валидатор регулярных выражений asp.net (VB.net). Мне нужно направить выражение для выражения из-за некоторых конкретных требований, которые меня попросили включить. Вот почему я не могу использовать одно из многих регулярных выражений, доступных в Интернете. – AgentHunt

+0

@ неизвестный Ли сказал, что «библиотека» не «регулярное выражение». Если вы прочтете ссылку Ли, вы увидите, что он рекомендует * против * использовать любое регулярное выражение вообще, потому что это по своей сути неверно. – Imagist

0

Если у вашего двигателя регулярных выражений есть утверждения lookbehind, вы можете просто добавить «(? <! \.)» Перед «@».

+0

Я использую валидатор регулярных выражений в asp.net. Будет ли это работать там? – AgentHunt

+0

Это работало, когда вы пробовали? – Imagist

0

Если вы делаете это в Perl - следующий скрипт пример

my $string = '[email protected]'; 
if($string =~/(\[email protected][a-zA-Z_]+?\.[a-zA-Z]{2,9})/) 
{ 
    print "gotcha!"; 
} 
else 
{ 
    print "nope :("; 
} 

Как вы можете видеть, символ регулярного выражения Perl \ w обрабатывает периоды грациозно. Если вы измените $ string на «name. @ Domain.com», это не удастся.

+0

ahhh - и в то время, когда мне потребовалось написать это, было дано около пяти хороших ответов :) – dls

3

Странная игра. Единственный выигрышный ход - не играть.

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

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

Что вы должны сделать:

  1. Отправить по электронной почте на адрес электронной почты со ссылкой на пользователя щелкать. Если пользователь нажимает на ссылку, адрес электронной почты действителен. Кроме того, он существует, и пользователь, вероятно, тот, кто ввел адрес электронной почты в вашу форму. Этот 100% не только подтверждает адрес электронной почты, но и дает вам еще больше гарантий.

  2. Если вы не можете сделать 1, используйте факсимилизатор предварительно упакованных сообщений. Лучше используйте как 1, так и 2.

  3. Если вы не можете сделать 1 или 2, напишите настоящий парсер для проверки адресов электронной почты.

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