2013-08-27 3 views
0

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

В любом случае, среди требований были следующие:

  • Нет последовательные периодов
  • специальных символов в позах 1
  • Нет периодов непосредственно до или после @
  • Разрешить следующие символы: +! # $% & */=? `{|} ~ '_-.

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

(^(?!.*\\.{2})([a-zA-Z0-9{1}]+[a-zA-Z0-9\\._\\-\\+!#$%&*/=?`{|}~']+[a-zA-Z0-9{1}])[email protected]([a-zA-Z0-9{1}]+[a-zA-Z0-9\\-]+[a-zA-Z0-9{1}]+\\.)+([a-zA-Z0-9\\-]{2}|net|com|gov|mil|org|edu|int|NET|COM|GOV|MIL|ORG|EDU|INT)$)|^$ 

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

Отредактировано: После долгих обсуждений выяснилось, что мои проблемы не были специфическими для локальной части адреса электронной почты. Часть домена также страдает от одних и тех же проблем.

Спасибо, Seb

+0

Спасибо всем, кто внес свой вклад в решении моей проблемы. :) – Seb

ответ

2

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

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

Разбивка:

^         # Beginning of the string 
[a-zA-Z0-9]      # First character is not special 
[a-zA-Z0-9+!#$%&*/=?`{|}~'_-]* # 0 or more alphanumeric and special characters, except . 
(?:        # Group, repeated 0 or more times 
    \.        # A literal . 
    [a-zA-Z0-9+!#$%&*/=?`{|}~'_-]+ # 1 or more alphanumeric and special characters, except . 
)* 

«Без последовательных периодов» и «Никакие периоды непосредственно перед или после условий @» не выполняются из-за того, что . может появляться только между двумя неточными символами, как показано в приведенном выше выражении.

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


Доменная часть имеет такую ​​же проблему с {1} внутри класса символов.

Я беру на себя смелость использовать ограничение на hostname, где этикетки не должны начинаться или заканчиваться -.

[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)* 

Если вы хотите обеспечить TLD:

[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)*\.(?i:[a-z0-9]{2}|net|com|gov|mil|org|edu|int) 

Обратите внимание, что я делаю ДВУ нечувствительны к регистру, используя не-захватив группу с i флагом.

+0

Исходя из редактирования исходного вопроса, я думаю, что '(? = [^ @] {3})' следует удалить, но все остальное выглядит правильно. – ajb

+0

@ajb: Вопрос запутан. Является ли «минимум 3 символа» одним из условий? – nhahtdh

+0

@nhahtdh Нет, это не одно из условий. Из-за моего неправильного регулярного выражения произошло минимум 3 символа. Минум должен быть 1 символ. – Seb

0

Не могли бы вы попробовать это (только небольшие изменения в код): (. Испытанные адреса, предоставленные до сих пор работы все они не совпадают.)

(^(?!.*\\.{2})([a-zA-Z0-9][a-zA-Z0-9\\._\\-\\+!#$%&*/=?`{|}~']+[a-zA-Z0-9])[email protected]([a-zA-Z0-9]+[a-zA-Z0-9\\-]+[a-zA-Z0-9]\\.)+([a-zA-Z0-9\\-]{2}|net|com|gov|mil|org|edu|int|NET|COM|GOV|MIL|ORG|EDU|INT)$)|^$ 

+0

Спасибо, Но мне по-прежнему требуется минимум 3 символа с помощью этого кода. – Seb

+0

Это отклонит 'ab_ @ something.com', который должен быть действительным. – nhahtdh

+0

Как насчет того, чтобы попробовать [email protected] или [email protected] или [email protected] – Seb