Regex для проверки международной электронной почты

Не уверен, что есть доступное решение, но не в состоянии найти. Так что прошу еще раз.

Я пишу валидатор электронной почты. Это должно проверить все хорошо сформированные электронные письма (это всего лишь один уровень проверки, чтобы проверить, что письмо хорошо сформировано). Теперь, когда мой код является международным кодом, я также должен поддерживать не латинские символы. Как написать наиболее эффективное Regex для этого?

Международные электронные письма: http://en.wikipedia.org/wiki/International_email

Некоторые примеры писем:

  • 伊昭傑 @郵件. 商務
  • राम@मोहन.ईन्फो
  • юзер@екзампл.кое
  • θσερ@εχαμπλε.ψομ

Он должен иметь возможность проверить все вышеперечисленные форматы

Ответ 1

Причина, по которой проверка подлинности электронной почты с помощью регулярного выражения настолько слаба, объясняется тем, что она неэффективна. Существует спецификация синтаксиса адреса электронной почты, но regexp, чтобы проверить, что это так долго, это нецелесообразно. Кроме того, поставщики электронной почты более строги в реализации синтаксиса, чем фактическая спецификация. Электронная почта может считаться действительной, поскольку спецификация говорит, что она есть, но недействительна в соответствии с поставщиком.

Это также причина, по которой появляются электронные письма активации, потому что единственный способ проверить, действительно ли электронная почта является действительной, существующей и в настоящее время используется, - это отправить ей что-то, как правило, уникальный код активации или ссылку. Только если этот уникальный код активации или ссылка, только отправленная на это письмо, будет использоваться, будет считаться действительным.

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

Ответ 2

@Patashu Большое спасибо. Я немного улучшил ваше регулярное выражение, и теперь он абсолютно соответствует моим потребностям:

^([^@\s\."'\(\)\[\]\{\}\\/,:;]+\.)*[^@\s\."'\(\)\[\]\{\}\\/,:;][email protected][^@\s\."'\(\)\[\]\{\}\\/,:;]+(\.[^@\s\."'\(\)\[\]\{\}\\/,:;]+)+$

Ответ 3

В случае Java это работает для меня хорошо.

"^[\\p{L}\\p{N}\\._%+-][email protected][\\p{L}\\p{N}\\.\\-]+\\.[\\p{L}]{2,}$"

Он не разрешает IP после @, но с ним может быть проверено самое действительное электронное письмо из [email protected]. \p{L} проверяет UTF-буквы и \p{N} проверяет номера UTF. Вы можете проверить этот документ для получения дополнительной информации.

Ответ 4

Это работает для меня, используя Python, если у вас нет специальных букв, символов, но есть тире (-), цифры, как в домене, так и в имени пользователя. Это также соответствует, если у вас есть расширения страны.

[A-Za-Z0-9.-] + @[A-Za-Z -]+. (. ([AZ] +)) (обыкн | | образование нетто) *