Как проверить адрес электронной почты в JavaScript

Есть ли регулярное выражение для проверки адреса электронной почты в JavaScript?

Предупреждение!! Принятый ответ, если он фактически неверен, так как не соответствует спецификациям. Прочтите все ответы для получения более подробной информации.

David Mårtensson 16.02.2021 21:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4 769
1
3 421 593
95
Перейти к ответу Данный вопрос помечен как решенный

Ответы 95

JavaScript может соответствовать регулярному выражению:

emailAddress.match( / some_regex /);

Вот регулярное выражение RFC22 для писем:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\]|\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\]|\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\[\]]|\[\x01-\x7f])+)\])(?(angle)>)$

@Kato: он использует некоторые несовместимые расширения, в том числе (?>, чтобы остановить отслеживание с возвратом, и (?<angle><)…(?(angle)>), чтобы избежать предоставления длинного |.

Ry- 10.03.2014 00:05

Метод match возвращает массив, метод test, который возвращает логическое значение, был бы лучше в этой ситуации.

iPzard 07.11.2020 23:43
Ответ принят как подходящий

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

function validateEmail(email) {
    const re = /^(([^<>()[\]\.,;:\s@"]+(\.[^<>()[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}

Вот пример регулярного выражения, которое принимает юникод:

const re = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

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

Вот пример вышеперечисленного в действии:

function validateEmail(email) {
  const re = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}

function validate() {
  const $result = $("#result");
  const email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").on("click", validate);
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>

Это регулярное выражение исключает действительные, используемые электронные письма. Не использовать. Google по запросу "RFC822" или "RFC2822", чтобы получить правильное регулярное выражение.

Randal Schwartz 08.09.2010 06:34

Он даже не принимает примеры из RFC 822. В некоторых простых случаях он не соответствует a \ @ b @ c.com, a(b)@c.com. Дополнительную информацию см. В RFC. Вот регулярное выражение, которое не отклоняет действительные адреса [^ @] + @ [^ @] + \. [^ @] + И защищает от типичных ошибок.

Vroo 26.10.2012 10:32

Вы не можете подтверждать адреса электронной почты, точка. Единственный, кто может подтвердить адрес электронной почты, - это его провайдер. Например, в этом ответе говорится, что эти адреса электронной почты: %[email protected], "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, [email protected], [email protected] , [email protected] действительны, но Gmail никогда не разрешит использование этих адресов электронной почты. Вы должны сделать это, приняв адрес электронной почты и отправив электронное сообщение на этот адрес электронной почты с кодом / ссылкой, которую пользователь должен посетить для подтверждения действительности.

Kevin Fegan 01.02.2014 12:49

В наши дни Javascript можно запускать на сервере, поэтому те, кто думают, что это актуально только для проверки на стороне клиента, ошибаются. И тем, кто говорит, что невозможно подтвердить электронную почту, я считаю, что вы вообще упускаете точку проверки. ВЫ НИКОГДА НЕ БУДЕТЕ писать валидацию для формы, чтобы гарантировать, что все на 100% идеально по двум основным причинам: 1. Это займет больше времени, чем стоило бы написать логику, и 2. Всегда будет крайний случай, когда неверные данные могут быть представлены. Причина, по которой мы проводим проверку, заключается в том, чтобы поощрять правильную отправку данных и предотвращать ошибки.

Cleanshooter 08.04.2015 18:02

Осторожно, это неверно: re.test("[email protected]")

adriaan 18.05.2015 16:47

Этот ответ не принимает действительный адрес электронной почты Gmail, например "[email protected]"

Felipe Skinner 06.11.2015 18:24

Возможно, это должно быть сказано «... проверить формат электронной почты ...» согласно комментарию Кевина. Также теперь в HTML5 есть type = "email".

fth 31.08.2020 00:51

Это регулярное выражение небезопасно и потенциально может стать причиной ReDoS. чек: stackblitz.com/edit/js-nllx8y

Mar 28.09.2020 10:54

Как я могу вместо этого поместить это в качестве шаблона в свой ввод?

Ryan H 07.10.2020 18:49

Все эти JS и RegEx даже без проверки допустимой длины (максимум 64 октета + @ + максимум 255 октетов) согласно RFC 3696 §3.

AmigoJack 16.10.2020 01:38

Этот ответ фактически неверен и его не следует принимать!

David Mårtensson 16.02.2021 21:24

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

^\S+@\S+$

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

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

kommradHomer 19.07.2012 11:14

Вы все еще можете сделать его простым, но сделайте еще немного, чтобы в нем был знак "." где-то после @ следуют только цифры или цифры, поэтому такие вещи, как я @ здесь, я @ здесь @ и я @ herecom, недействительны ... ^ \ S + @ \ S + [\.] [0-9a-z ] + $

Tim Franklin 21.03.2013 08:06

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

Sam 11.04.2013 03:51

/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð")true

gtournie 27.01.2014 08:57

@gtournie Всем плевать. Никто не собирается вводить это в поле электронной почты случайно, и это все, что интерфейсная проверка предназначена для: Чтобы люди не могли случайно ввести неправильный бит информации, такой как свое имя, в поле электронной почты.

meagar 31.01.2015 17:59

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

Julian Krispel-Samsel 13.11.2020 19:03

Есть кое-что, что вам нужно понять, как только вы решите использовать регулярное выражение для проверки электронной почты: Это наверное плохая идея. Как только вы смирились с этим, есть много реализаций, которые могут помочь вам на полпути, эта статья прекрасно их подводит.

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

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

kommradHomer 19.07.2012 11:16

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

kommradHomer 19.07.2012 18:32

@kommradHomer - адрес "недопустимое регулярное выражение" почти всегда действителен, потому что любое регулярное выражение, которое вы используете для проверки адреса электронной почты, почти наверняка неверно и исключает действительные адреса электронной почты. Адрес электронной почты - name_part@domain_part, и практически все, включая или @, допустимо в name_part; Адрес foo@[email protected] является допустимым, хотя он должен быть экранирован как foo\@bar@machine..... Как только электронное письмо достигнет домена, например 'example.com' этот домен может маршрутизировать почту «локально», поэтому могут существовать «странные» имена пользователей и хостов.

Stephen P 07.03.2013 05:40

Это было украдено с http://codesnippets.joyent.com/posts/show/1917

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}

Следующее регулярное выражение:

/^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,3}){1,2}$/;

Это не соответствует RFC.

tchrist 14.07.2013 22:35

Трудно получить 100% правильный валидатор электронной почты. Единственный реальный способ исправить это - отправить тестовое электронное письмо на учетную запись. Тем не менее, есть несколько основных проверок, которые могут помочь убедиться, что вы получаете что-то разумное.

Некоторые вещи, которые нужно улучшить:

Вместо нового RegExp просто попробуйте написать regexp следующим образом:

if (reg.test(/@/))

Во-вторых, убедитесь, что после знака @ стоит точка, и убедитесь, что между @ и точками есть символы.

Для полноты картины, здесь у вас есть другое регулярное выражение, совместимое с RFC 2822

The official standard is known as RFC 2822. It describes the syntax that valid email addresses must adhere to. You can (but you shouldn'tread on) implement it with this regular expression:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

(...) We get a more practical implementation of RFC 2822 if we omit the syntax using double quotes and square brackets. It will still match 99.99% of all email addresses in actual use today.

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

A further change you could make is to allow any two-letter country code top level domain, and only specific generic top level domains. This regex filters dummy email addresses like [email protected]. You will need to update it as new top-level domains are added.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

So even when following official standards, there are still trade-offs to be made. Don't blindly copy regular expressions from online libraries or discussion forums. Always test them on your own data and with your own applications.

Emphasis mine

NB: «Фактическое использование сегодня» могло быть действительным, когда код был написан еще в 200x. Код буду, вероятно, останется в использовании и после этого конкретного года. (Если бы у меня было десять центов за каждое «да, никто никогда не будет использовать 4 + -буквенный TLD, кроме тех конкретных», которые мне пришлось исправить, я мог бы загнать в угол мировой рынок меди и никеля;))

Piskvor left the building 13.06.2012 19:51

сейчас существует так много доменов верхнего уровня, что фильтрация по ним контрпродуктивна. или хотя бы склонны к постоянным изменениям.

pstanton 24.07.2020 02:35

Кажется, это не относится к комментариям в адресах электронной почты, которые есть в RFC, как бы абсурдно это ни было. matt@example (this is comment don't you know) .com должен совпадать, но это не так.

Matt Ellen 08.02.2021 19:41

Вот очень хорошее обсуждение использования регулярных выражений для проверки адресов электронной почты; «Сравнение адресов электронной почты с проверкой регулярных выражений»

Вот текущее верхнее выражение, совместимое с JavaScript, для справки:

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i

Видимо, вот и все:

/^([\w\!\#$\%\&\'\*\+\-/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

Взято из http://fightingforalostcause.net/misc/2006/compare-email-regex.php 1 октября 2010 г.

Но, конечно, это игнорирование интернационализации.

Правильная проверка адреса электронной почты в соответствии с RFC не может быть достигнута с помощью однострочного регулярного выражения. Статья с лучшим решением, которое я нашел на PHP, - Что такое действующий адрес электронной почты?. Очевидно, он был перенесен на Java. Я считаю, что эта функция слишком сложна, чтобы ее можно было переносить и использовать в JavaScript. Порт JavaScript / node.js: https://www.npmjs.com/package/email-addresses.

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

Вот функция JavaScript, которую я использую, чтобы проверить, выглядит ли строка как действительный почтовый адрес:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

Объяснение:

  • lastAtPos < lastDotPos: Последний @ должен быть перед последним ., поскольку @ не может быть частью имени сервера (насколько мне известно).

  • lastAtPos > 0: должно быть что-то (имя пользователя электронной почты) перед последним @.

  • str.indexOf('@@') == -1: в адресе не должно быть @@. Даже если @ отображается как последний символ в имени пользователя электронной почты, он должен быть заключен в кавычки, чтобы " находился между этим @ и последним @ в адресе.

  • lastDotPos > 2: перед последней точкой должно быть не менее трех символов, например [email protected].

  • (str.length - lastDotPos) > 2: после последней точки должно быть достаточно символов, чтобы сформировать двухсимвольный домен. Не уверен, нужны ли скобки.

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

GnrlBzik 09.12.2020 05:24

В HTML5 есть проверка адреса электронной почты. Если ваш браузер поддерживает HTML5, вы можете использовать следующий код.

<form><input type = "email" placeholder = "[email protected]" required>
    <input type = "submit">
</form>

jsFiddle ссылка

Из Спецификация HTML5:

A valid e-mail address is a string that matches the email production of the following ABNF, the character set for which is Unicode.

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

This requirement is a willful violation of RFC 5322, which defines a syntax for e-mail addresses that is simultaneously too strict (before the "@" character), too vague (after the "@" character), and too lax (allowing comments, whitespace characters, and quoted strings in manners unfamiliar to most users) to be of practical use here.

The following JavaScript- and Perl-compatible regular expression is an implementation of the above definition.

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

это хорошо, но проблема заключается в том, что он должен находиться внутри тега form и передаваться через вход submit, что не у всех есть на такое удовольствие. Кроме того, вы не можете стилизовать сообщение об ошибке.

Jason 12.11.2011 04:08

Декабрь 2020 г. @Jason - Требуется ли проверка HTML5 «внутри тега формы и отправлена ​​с помощью ввода для отправки»? или его можно «назвать» в Javascript. Эта проверка, кажется, происходит ПОСЛЕ моих закодированных проверок Javascript.

aNewb 03.12.2020 05:13

Семантика HTML требует наличия элемента <form />, если вы отображаете компонент формы. При этом вы всегда должны использовать форму при использовании ввода.

Dimitri Kopriwa 23.12.2020 20:44

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

Теперь, когда вы можете охватить только 90% случаев, напишите что-нибудь вроде:

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

Вы можете это доработать. Например, допустимо «aaa @». Но в целом суть вы уловили. И не увлекайтесь ... Простое 90% решение лучше, чем 100% решение, которое не работает.

Миру нужен более простой код ...

Это позволяет вводить так много недействительных адресов электронной почты, что это бесполезный совет.

cazlab 07.01.2012 03:07

Я немного изменил Ответ Джеймона для людей, которым нужна действительно простая проверка в виде:

[email protected]

Регулярное выражение:

/\S+@\S+\.\S+/

Чтобы предотвратить совпадение нескольких знаков @:

/^[^\s@]+@[^\s@]+$/

Пример функции JavaScript:

function validateEmail(email) 
    {
        var re = /\S+@\S+\.\S+/;
        return re.test(email);
    }
    
console.info(validateEmail('[email protected]'));

Вы можете реализовать что-то в 20 раз длиннее, что может вызвать проблемы у некоторых пользователей и может оказаться недействительным в будущем, или вы можете взять версию ImmortalFirefly, чтобы убедиться, что они хотя бы приложили усилия, чтобы она выглядела реальной. В зависимости от вашего приложения более вероятно, что кто-то рассердится, потому что вы не принимаете его нестандартный адрес электронной почты, а не тот, кто вызывает проблемы, вводя адреса электронной почты, которые на самом деле не существуют (что они могут сделать в любом случае, введя 100% действительный адрес электронной почты RFC2822, но с использованием незарегистрированного имени пользователя или домена). Проголосовали!

user83358 30.07.2012 22:20

@ImmortalFirefly, указанное вами регулярное выражение фактически будет соответствовать name@[email protected]. Попробуйте вставить свою строку в консоль JavaScript. Я считаю, что вы намеревались сопоставить только весь текст, что потребовало бы начала текста '^' и конца текста '$' операторов. Я использую /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@[email protected]').

OregonTrail 09.08.2012 18:58

@OregonTrail Действительные адреса электронной почты могут содержать символы @ в кавычках, и ваше регулярное выражение будет их отклонять. Возможно, это ставит его на нежелательную золотую середину, где есть ошибки как типа I, так и типа II (то есть вам будет лучше с ошибками типа I из большого регулярного выражения или просто с ошибками типа II из крошечного). По общему признанию, это компромисс, поскольку двойную опечатку @ довольно легко сделать, а электронные письма, содержащие лишние @, на практике практически не существуют.

Paul Hendry 03.12.2020 22:13

У меня все получалось неплохо, пока один сын клиента не ввел "[email protected] This is my ?" - оказалось, что он также позволяет смайлики и пробелы: / Так что моя рекомендация - по крайней мере проверить начало и конец строки, добавив ^ и $ - /^\S+@\S+\.\S+$/

scythargon 08.03.2021 17:46

В отличие от сквиртл, это сложное решение, но оно отлично справляется с проверкой электронных писем:

function isEmail(email) { 
    return /^((([a-z]|\d|[!#$%&'\*\+\-/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#$%&'\*\+\-/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

Используйте так:

if (isEmail('[email protected]')){ console.info('This is email is valid'); }

Решение Sectrean отлично работает, но это не помогло моему линтер. Итак, я добавил несколько побегов:

function validateEmail(email){ 
     var re = /^(([^<>()[]\.,;:\s@\"]+(\.[^<>()[]\.,;:\s@\"]+)*)|(\".+\"))@(([[0-9]{1,3}\‌​.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 
     return re.test(email); 
}

validateEmail ("[email protected]") и validateEmail ("[email protected]") оба возвращают значение false.

Ikrom 22.10.2013 14:04

function validateEmail(elementValue){        
    var emailPattern = /^[a-zA-Z0-9._]+[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/;  
    return emailPattern.test(elementValue);   
  }   

Он возвращает истину, если адрес электронной почты действителен. В противном случае он вернет false.

Сделай это:

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

Почему? Он основан на RFC 2822, который является стандартным, ДОЛЖНЫ соблюдаться ВСЕ адреса электронной почты. И я не уверен, зачем вам что-то "попроще" ... вы все равно скопируете и вставите это;)

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

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

Вот пример его использования в JavaScript (с нечувствительным к регистру флагом i в конце).

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.info( emailCheck.test('[email protected]') );

Примечание:
Технически некоторые электронные письма могут включать кавычки в разделе перед символом @ с escape-символами внутри кавычек (так что ваш пользователь электронной почты может быть неприятным и содержать такие вещи, как @ и "...", если он написан в кавычках). ЭТО НИКОГДА НЕ ДЕЛАЕТ! Это устарело. Но он включен в настоящий стандарт RFC 2822 и здесь опущен.

Более подробная информация: http://www.regular-expressions.info/email.html

В современных браузерах вы можете построить поверх ответа @Sushil с помощью чистого JavaScript и ДОМ:

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

Я собрал пример на скрипке http://jsfiddle.net/boldewyn/2b6d5/. В сочетании с обнаружением функций и простой проверкой Ответ Сквиртла, он освобождает вас от резни регулярных выражений и не работает в старых браузерах.

Это отличная идея, чтобы решить проблему, но она не работает, потому что в браузерах тоже дрянная проверка. Например. .@a проверяется как true в текущих версиях Chrome, Firefox и Safari.

Hank 02.05.2013 22:44

@HenryJackson К сожалению, в этом случае да. Это потому, что в соответствии с RFC это действительный адрес электронной почты (например, интрасети). Браузеры будут раздражены, если они будут проверять слишком узко и давать ложноотрицательные результаты.

Boldewyn 03.05.2013 11:02

<form name = "validation" onSubmit = "return checkbae()">
    Please input a valid email address:<br />

    <input type = "text" size=18 name = "emailcheck">
    <input type = "submit" value = "Submit">
</form>

<script language = "JavaScript1.2">
    var testresults
    function checkemail(){
        var str = document.validation.emailcheck.value
        var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
        if (filter.test(str))
            testresults = true
        else {
            alert("Please input a valid email address!")
            testresults = false
        }
        return (testresults)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>

См. Предыдущий комментарий 32, это хорошо, но проблема заключается в том, что он должен быть внутри тега формы и отправлен с помощью ввода submit, что не у всех есть на это роскошь. Кроме того, вы не можете стилизовать сообщение об ошибке. - @Jason 12 нояб.

aNewb 03.12.2020 05:21

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

Наиболее частые ошибки, с которыми я сталкивался, - это пробелы (особенно в начале и конце), а иногда и двойная точка.

function check_email(val){
    if (!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if ( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('[email protected]'); // Returns false
check_email(' [email protected]'); // Returns false
check_email('[email protected]'); // Returns true

Это правильная версия RFC822.

function checkEmail(emailAddress) {
  var sQtext = '[^\x0d\x22\x5c\x80-\xff]';
  var sDtext = '[^\x0d\x5b-\x5d\x80-\xff]';
  var sAtom = '[^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+';
  var sQuotedPair = '\x5c[\x00-\x7f]';
  var sDomainLiteral = '\x5b(' + sDtext + '|' + sQuotedPair + ')*\x5d';
  var sQuotedString = '\x22(' + sQtext + '|' + sQuotedPair + ')*\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}

Адреса IDN не проверяются (info@üpöü.com)

D.A.H 17.08.2014 21:38

'a @ a' возвращает действительный: jsfiddle.net/pmiranda/guoyh4dv

pmiranda 02.02.2021 21:18

Просто проверьте, действителен ли введенный адрес электронной почты или нет, используя HTML.

<input type = "email"/>

Нет необходимости писать функцию для проверки.

См. Предыдущий комментарий 32, это хорошо, но проблема заключается в том, что он должен быть внутри тега формы и отправлен с помощью ввода submit, что не у всех есть на это роскошь. Кроме того, вы не можете стилизовать сообщение об ошибке. - @Jason 12 нояб.

aNewb 03.12.2020 05:19

Все адреса электронной почты содержат символ «at» (т. Е. @). Проверьте это необходимое условие:

email.indexOf("@") > 0

Не беспокойтесь ни о чем более сложном. Даже если бы вы могли точно определить, является ли электронное письмо валидным с точки зрения RFC, это не скажет вам, принадлежит ли оно тому, кто его предоставил. Вот что действительно важно.

Чтобы проверить это, отправьте сообщение проверки.

что, если будет более одного символа '@'? другие запрещенные символы? Этой проверке нельзя доверять ...

iwazovsky 26.04.2015 13:14

это действительный адрес электронной почты a @ b?

Aravin 20.12.2020 13:17

@Aravin Может быть, в локальной сети.

Nayuki 21.12.2020 08:56

но это вопрос общий, а не для локальной системы LAN

Aravin 21.12.2020 12:47

Это лучше, чем у большинства, да, у вас может быть более одного @ с этим, но это также может быть действительный адрес электронной почты, например "@"@mydomain.jskd "или elldffs (это @ comment) @ mydomain.kjfdij. Оба являются синтаксически допустимыми электронными письмами.

David Mårtensson 16.02.2021 21:37

Если вы используете Closure, вы можете использовать встроенный тип goog.format.EmailAddress:

http://docs.closure-library.googlecode.com/git/class_goog_format_EmailAddress.html

Например:

goog.format.EmailAddress.isValidAddrSpec("[email protected]")

Обратите внимание: прочитав источник (ссылка на который приведена выше), вы увидите, что в комментариях указано, что IDN не поддерживаются и что он предназначен только для адресов наиболее:

// This is a fairly naive implementation, but it covers 99% of use cases.
// For more details, see http://en.wikipedia.org/wiki/Email_address#Syntax
// TODO(mariakhomenko): we should also be handling i18n domain names as per
// http://en.wikipedia.org/wiki/Internationalized_domain_name

Вот как это делает узел-валидатор:

/^(?:[\w\!\#$\%\&\'\*\+\-/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/

W3Школы дает хороший простой и эффективный скрипт для проверки электронной почты:

function validateEmail(email) {
    var atpos=email.indexOf("@");
    var dotpos=email.lastIndexOf(".");
    if (atpos < 1 || dotpos < atpos+2 || dotpos+2 >= email.length) {
        alert("Not a valid e-mail address");
        return false;
    }
    return true;
}

Обратите внимание, что вам придется удалить пробелы, если они есть, примерно так:

.replace(/ /g,'')

Источник: Проверка формы JavaScript

Используйте этот код внутри своей функции валидатора:

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

В противном случае вы можете использовать jQuery. Внутренние правила определяют:

eMailId: {
    required: true,
    email: true
}

Регулярное выражение, предоставленное Microsoft в ASP.NET MVC, выглядит следующим образом:

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

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

Не позволяет использовать + в части имени в электронном письме.

Paul Go 09.03.2015 18:19

<pre>
**The personal_info part contains the following ASCII characters.
1.Uppercase (A-Z) and lowercase (a-z) English letters.
2.Digits (0-9).
3.Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~
4.Character . ( period, dot or fullstop) provided that it is not the first or last character and it will not come one after the other.**
</pre>
*Example of valid email id*
<pre>
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
</pre>
<pre>
xxxx.ourearth.com [@ is not present] 
[email protected] [ tld (Top Level domain) can not start with dot "." ]
@you.me.net [ No character before @ ]
[email protected] [ ".b" is not a valid tld ]
[email protected] [ tld can not start with dot "." ]
[email protected] [ an email should not be start with "." ]
xxxxx()*@gmail.com [ here the regular expression only allows character, digit, underscore and dash ]
[email protected] [double dots are not allowed
</pre>
**javascript mail code**

    function ValidateEmail(inputText)
    {
    var mailformat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
    if (inputText.value.match(mailformat))
    {
    document.form1.text1.focus();
    return true;
    }
    else
    {
    alert("You have entered an invalid email address!");
    document.form1.text1.focus();
    return false;
    }
    }

Очень просто в JavaScript. следуйте этому коду.

function validate(){
    var email = document.getElementById('Email');
    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

    if (!filter.test(email.value))
    {
        alert('Please Enter the valid email address');
        email.focus;
        return false;
    }
    else
{
        return true;
    }

Код HTML для этого:

form name = "form"
     enctype = "multipart/form-data"
     name = "form"
     action = "register.php"
     method = "POST" onsubmit = "return validate();" >
    <input type = "text" placeholder = "Enter ur Email Id" id = "Email" name = "Email" />
    <input type = "submit" id = "submit" value = "save" name = "Like" class = "button" />
</form>

Этот фильтр делает недействительными многие распространенные действительные адреса электронной почты ... Например: [email protected]

kjpires 28.02.2014 23:03

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

function isValidEmailAddress (email) {
    var validEmail = false;
    if (email) {
        email = email.trim().toLowerCase();
        var pattern = /^[\w-']+(\.[\w-']+)*@([a-zA-Z0-9]+[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*?\.[a-zA-Z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/;
        validEmail = pattern.exec(email);
    }

    return validEmail;
}

if (typeof String.prototype.trim !== 'function') {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
    };
}

function validatecontactEmail(email) { 

 if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email))  
  {  
    return (true)  
  }  

    return (false)  

}

Как насчет return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)?

Michael Schilling 14.11.2014 06:24

Вот функция, которую я использую для проверки электронной почты на внешнем интерфейсе. (Регулярное выражение взято из parsley.js)

<!DOCTYPE html>
<html>
<head>
    <title>Our Company</title>
    <style>
        .form-style {
            color: #ccc;
        }
    </style>
</head>
<body>
    <h1>Email Validation Form Example</h1>
    <input type = "text" name = "email" id = "emailInput" class = "form-style">
    <script>
        function validateEmail(emailAddress) {
            var regularExpression = /^((([a-z]|\d|[!#$%&'\*\+\-/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#$%&'\*\+\-/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))){2,6}$/i;
             return regularExpression.test(emailAddress);
        }

        function showEmailValidationState(event) {
            if (validateEmail(event.target.value)) {
                document.getElementById("emailInput").style.color = 'black';
            }
        }
    document.getElementById("emailInput").addEventListener("keyup", showEmailValidationState);
    </script>
</body>
</html>

Если вы используете AngularJS, просто добавьте type = "email" во входной элемент:

https://docs.angularjs.org/api/ng/input/input%5Bemail%5D

В случае отсутствия элемента ввода его можно создать динамически:

var isEmail = $compile('<input ng-model = "m" type = "email">')($rootScope.$new()).
    controller('ngModel').$validators["email"];

if (isEmail('[email protected]')) {
  console.info('valid');
} 

Но что это функция парсера электронной почты? Не могли бы вы выложить его, чтобы его можно было использовать без angular?

Bergi 15.12.2014 05:07

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

Eric Bishard 24.08.2015 05:09

Регулярное выражение проверки для электронной почты:

var rex_email = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

if (email= = "") {
    window.plugins.toast.showShortBottom( "Please enter the details. ", function(a) {
        console.info('toast success: ' + a);
    }, function(b) { });
} else if (!rex_email.test(email)) {
    window.plugins.toast.showShortBottom( "Please enter the valid email id. ", function(a) {
        console.info('toast success: ' + a);
    }, function(b) { });
}

Это будет работать для очень распространенных базовых адресов электронной почты, но есть определенные крайние случаи, когда это приведет к отклонению действительных адресов электронной почты. Если вы читали остальные 36 (!) Ответов здесь, вы бы уже это знали.

Qantas 94 Heavy 07.02.2015 03:12

Я знаю, что это не регулярное выражение, но в любом случае ...

Это пример с узлом и пакетом npm адрес электронной почты, это окончательная проверка, существует ли электронная почта и находится ли она в правильной форме :)

Это будет пинговать электронное письмо, если оно отвечает, если оно не получило ответа, оно вернет false или true.

function doesEmailExist(email) {
    var emailExistence = require('email-existence');
    return emailExistence.check(email,function (err,status) {
            if (status) {
                return status;
            }
            else {
                throw new Error('Email does not exist');
            }
        });
}

Следующие проверки Regex:

  • Перед @ не должно быть пробелов.
  • (-) и (.) не должны быть вместе после @ Никаких специальных символов после @ 2 символа должны перед @ Длина электронного письма не должна превышать 128 символов.
function validateEmail(email) {
var chrbeforAt = email.substr(0, email.indexOf('@'));
if (!($.trim(email).length > 127)) {
    if (chrbeforAt.length >= 2) {
        var re = /^(([^<>()[\]{}'^?\.,!|//#%*-+=&;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
        //var re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
        return re.test(email);
    } else {
        return false;
    }
} else {
    return false;
}
}

Следующие проверки Regex:

  • Перед @ не должно быть пробелов.
  • (-) и (.) не должны быть вместе после @
  • Никаких специальных символов после @ 2 символа не должно быть перед @
  • Длина электронного письма не должна превышать 128 символов.

    function validateEmail(email) {
        var chrbeforAt = email.substr(0, email.indexOf('@'));
        if (!($.trim(email).length > 127)) {
            if (chrbeforAt.length >= 2) {
                var re = /^(([^<>()[\]{}'^?\.,!|//#%*-+=&;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
                return re.test(email);
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    

\b[a-z][\w\d_\.]+@\w+\.[a-z]{2}[a-z]?\.?[a-z]{,2}\s

Это позволяет:

[email protected]    
[email protected]   
[email protected]   
[email protected]

Хорошая попытка: 2 обновления здесь: Для диапазонов совпадений мы предоставляем {min,max}. Пустой min является ошибкой, но может иметь пустой max. То есть [a-z]{,2} не так, пишите как {0,2}. Более того: ваше регулярное выражение показывает kamal@_gmail.com как действительный, а это не так!

Kamal Nayan 14.03.2016 13:46

лучший: D (RFC-friendly и без ошибок "слишком сложно"):

function    isMail(mail)
{
    pattuser = /^([A-Z0-9_%+\-!#$&'*/=?^`{|}~]+\.?)*[A-Z0-9_%+\-!#$&'*/=?^`{|}~]+$/i;
    pattdomain = /^([A-Z0-9-]+\.?)*[A-Z0-9-]+(\.[A-Z]{2,9})+$/i;

    tab = mail.split("@");
    if (tab.length != 2)
        return false;
    return (pattuser.test(tab[0]) && pattdomain.test(tab[1]));
}

Если вы хотите использовать JQuery и хотите иметь современный подход, используйте маску ввода JQuery с проверкой.

http://bseth99.github.io/projects/jquery-ui/5-jquery-masks.html

Демонстрация того, как простая маска ввода jquery находится здесь: http://codepen.io/anon/pen/gpRyBp

Пример простой маски ввода для даты, например, НЕ полная проверка

 <input id = "date" type = "text" placeholder = "YYYY-MM-DD"/>

и сценарий:

 $("#date").mask("9999-99-99",{placeholder:"YYYY-MM-DD"});

Лучше всего использовать встроенный тег электронной почты HTML5.

<input type = "email" name = "email">

или общий синтаксис электронной почты как распознавание @ и. из строки приведен ниже.

^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$

Note that this would still produce invalid email that will still match the regex, its almost impossible to catch them all but this will improve the situation a little.

См. Предыдущий комментарий 32, это хорошо, но проблема заключается в том, что он должен быть внутри тега формы и отправлен с помощью ввода submit, что не у всех есть на это роскошь. Кроме того, вы не можете стилизовать сообщение об ошибке. - @Jason 12 нояб.

aNewb 03.12.2020 05:24

Я считаю, что это лучшее решение:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

Он позволяет использовать следующие форматы:

1.  [email protected]
2.  [email protected]
3.  [email protected]
4.  [email protected]
9.  #!$%&'*+-/=?^_`{}|[email protected]
6.  "()[]:,;@\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
7.  " "@example.org (space between the quotes)
8.  üñîçøðé@example.com (Unicode characters in local part)
9.  üñîçøðé@üñîçøðé.com (Unicode characters in domain part)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Greek)
12. 我買@屋企.香港 (Chinese)
13. 甲斐@黒川.日本 (Japanese)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

Он явно универсален и позволяет использовать все важные международные символы, сохраняя при этом базовый формат [email protected]. Он будет блокировать пробелы, которые технически разрешены RFC, но они настолько редки, что я счастлив сделать это.

Он соответствует тому, что вы определили сами, но хост-часть адреса электронной почты не обязательно является доменом. Следовательно, точка - это не то, на что можно положиться - примеры: john@[::1] и john@server.

AmigoJack 16.10.2020 01:26

Это регулярное выражение предотвращает дублирование доменных имен, таких как [email protected], оно разрешает только домен два раза, например [email protected]. Он также не позволяет выполнять статистику с таких номеров, как [email protected].

regexp: /^([a-zA-Z])+([a-zA-Z0-9_.+-])+\@(([a-zA-Z])+\.+?(com|co|in|org|net|edu|info|gov|vekomy))\.?(com|co|in|org|net|edu|info|gov)?$/,  

Всего наилучшего !!!!!

Зачем вам нужно использовать что-то подобное? Спецификация стандартов адресов электронной почты предполагает, что адреса электронной почты могут начинаться с цифр и могут содержать несколько символов точки как в доменной, так и в lcoal части. Кажется, что этот ответ создан вами для совершенно индивидуального сценария, в котором вы эффективно дискриминируете людей за то, что у них есть адреса электронной почты, которые вам не нравятся! Чтобы немного расширить, адреса электронной почты также могут содержать IP-адреса, поэтому это потенциально даже более ограничительно, чем описано.

XtrmJosh 03.11.2015 16:24

Верно !!!!!! Но у разных людей могут быть разные требования, и поэтому мы пишем проверки .... не так ли ?????????

Brijeshkumar 04.11.2015 12:53

Ну не совсем. Мы используем проверку, чтобы подтвердить, что ввод соответствует нашим ожиданиям, чтобы избежать попыток использовать плохо отформатированные данные определенными способами. В этом случае OP ищет код, который может проверить адрес электронной почты, как и задумано. В вашем случае вы, кажется, подтверждаете, что строка является тем, чем вы хотите, чтобы она была. Проще говоря, вы подтверждаете, что строка соответствует тому, что вы хотите, чтобы она соответствовала, а это не адрес электронной почты, в то время как OP проверяет, что строка соответствует адресу электронной почты. Это не одно и то же.

XtrmJosh 05.11.2015 22:11

Простое регулярное выражение для идентификатора электронной почты

 String EMAIL_PATTERN  = "^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$";

Согласно вашему регулярному выражению "_.............. [email protected]" действительно, чего не должно быть!

Kamal Nayan 14.03.2016 13:38

Используйте регулярное выражение:

 /^[a-z][a-zA-Z0-9_.]*(\.[a-zA-Z][a-zA-Z0-9_.]*)?@[a-z][a-zA-Z-0-9]*\.[a-z]+(\.[a-z]+)?$/

Пример:

function validateEmail(email) {
    var re = /^[a-z][a-zA-Z0-9_.]*(\.[a-zA-Z][a-zA-Z0-9_.]*)?@[a-z][a-zA-Z-0-9]*\.[a-z]+(\.[a-z]+)?$/;
    return re.test(email);
}

Он должен разрешать только @,. , _

Я смешал код @mevius и @Boldewyn, чтобы создать этот окончательный код для проверки электронной почты с помощью JavaScript.

function ValidateEmail(email){
 
  var re = /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
 
  var input = document.createElement('input');
 
  input.type = 'email';
  input.value = email;
 
  return typeof input.checkValidity == 'function' ? input.checkValidity() : re.test(email);
 
}

Я поделился этим кодом в своем блоге здесь.

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

Etienne Martin 25.11.2018 00:29

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

  • Оригинальный
    /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

  • Модифицировано
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

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

И вы можете увидеть результат в здесь.

Локальная часть имеет максимальную длину, которая не подтверждена.

AmigoJack 16.10.2020 01:29

Если вы используете ng-pattern и материал, это выполнит свою работу.

vm.validateEmail = '([a-zA-Z0-9_.]{1,})((@[a-zA-Z]{2,})[\\.]([a-zA-Z]{2}|[a-zA-Z]{3}))';

Тот, кто использует решение @pvl и хочет, чтобы оно передавало ESLint Prefer-шаблон, тогда вот версия, в которой я использовал литералы шаблона вместо конкатенации строк.

validateEmail(email) {
    let sQtext = '[^\x0d\x22\x5c\x80-\xff]';
    let sDtext = '[^\x0d\x5b-\x5d\x80-\xff]';
    let sAtom = '[^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+';
    let sQuotedPair = '\x5c[\x00-\x7f]';
    let sDomainLiteral = `\x5b(${sDtext}|${sQuotedPair})*\x5d`;
    let sQuotedString = `\x22(${sQtext}|${sQuotedPair})*\x22`;
    let sDomainRef = sAtom;
    let sSubDomain = `(${sDomainRef}|${sDomainLiteral})`;
    let sWord = `(${sAtom}|${sQuotedString})`;
    let sDomain = `${sSubDomain}(\x2e${sSubDomain})*`;
    let sLocalPart = `${sWord}(\x2e${sWord})*`;
    let sAddrSpec = `${sLocalPart}\x40${sDomain}`; // complete RFC822 email address spec
    let sValidEmail = `^${sAddrSpec}$`; // as whole string

    let reValidEmail = new RegExp(sValidEmail);

    return reValidEmail.test(email);
}

Регулярное выражение для проверки адреса электронной почты

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

Решение, которое не проверяет наличие TLD, является неполным.

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

1- Проверка формата электронной почты: Убедиться, что электронное письмо соответствует формату и шаблону электронных писем в RFC 5322 и действительно ли существует TLD. Список всех действительных TLD можно найти в здесь.

Например, хотя адрес [email protected] будет передавать регулярное выражение, это недействительный адрес электронной почты, поскольку ccc не является доменом верхнего уровня IANA.

2- Убедитесь, что электронное письмо действительно существует: Для этого единственный вариант равен отправить пользователям электронное письмо.

Я искал Regex в JS, который проходит все тестовые примеры адресов электронной почты:

  • [email protected] Действительный адрес электронной почты

  • [email protected] Электронная почта содержит точку в поле адреса

  • [email protected] Электронная почта содержит точку с субдоменом

  • [email protected] Знак плюс считается допустимым символом

  • [email protected] Домен - действительный IP-адрес

  • email@[192.0.2.123] Квадратная скобка вокруг IP-адреса считается допустимой.

  • “email”@example.com Цитаты по электронной почте считаются действительными

  • [email protected] Цифры в адресе действительны

  • [email protected] Тире в доменном имени является допустимым

  • [email protected] Подчеркивание в поле адреса допустимо

  • [email protected].name является действительным доменным именем верхнего уровня

  • Точка [email protected] в доменном имени верхнего уровня также считается действительной (здесь используется co.jp в качестве примера)

  • [email protected] Дефис в адресном поле действителен

Вот так :

http://regexr.com/3f07j

ИЛИ регулярное выражение:

Regex = /(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@[*[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+]*/

В nodeJS вы также можете использовать модуль узла валидатора и просто использовать его

Установите библиотеку с помощью валидатора установки npm

var validator = require('validator');

validator.isEmail('[email protected]'); //=> true 

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

В качестве альтернативы определите его как регулярное выражение:

var pattern = /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/; 

Здесь написано несколько сложных RegEx, которые тоже работают.

Я тестировал этот, и он тоже работает:

[a-zA-Z0-9._]+[@]+[a-zA-Z0-9]+[.]+[a-zA-Z]{2,6}

Пожалуйста, проверьте это здесь: http://www.regextester.com/?fam=97334

Надеюсь это поможет.

me@localhost не работает.

Agi Hammerthief 02.02.2018 00:08

Я хотел бы добавить небольшое замечание о символах, отличных от ASCII. Решение Rnevius (и др.) Великолепно, но оно позволяет добавлять кириллицу, японский язык, смайлики и другие символы Unicode, которые могут быть ограничены некоторыми серверами.

Приведенный ниже код будет печатать true, хотя он содержит символ UTF-8 Ё.

console.info (/^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test ('Ё@example.org'))

В моем случае все символы, отличные от ASCII, запрещены, поэтому я изменил исходное выражение, чтобы исключить все символы выше U + 007F:

/^(([^\u0080-\uffff<>()\[\]\.,;:\s@"]+(\.[^\u0080-\uffff<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

Возможно, это поможет кому-то предотвратить нежелательное поведение.

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

jcollum 13.08.2017 20:48

Как насчет создания функции, которая будет проверять любую строку на соответствие шаблону электронных писем с использованием регулярного выражения в JavaScript, поскольку мы знаем, что адреса электронной почты могут сильно отличаться в разных регионах, например, в Великобритании и Австралии обычно заканчиваются .co.uk или .com.au, поэтому я попробовал чтобы охватить и их, также проверьте, передана ли строка функции, примерно так:

var isEmail = function(str) {
  return typeof str==='string' && /^[\w+\d+._]+\@[\w+\d+_+]+\.[\w+\d+._]{2,8}$/.test(str);
}

и проверьте, есть ли это по электронной почте, как показано ниже:

isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]#sswzazaaaa'); //false
isEmail('[email protected]'); //false

Что происходит с [email protected] или phil.h\@\@[email protected]?

Agi Hammerthief 02.02.2018 00:03

Стандартный синтаксис почты Википедии:

https://en.wikipedia.org/wiki/Email_address#Exampleshttps://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte

function validMail(mail)
{
    return /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+([^<>()\.,;:\s@\"]{2,}|[\d\.]+))$/.test(mail);
}

// VALID MAILS

validMail('[email protected]') // Return true
validMail('[email protected].') // Return true
validMail('[email protected]') // Return true
validMail('user@localserver') // Return true
validMail('[email protected]') // Return true
validMail('user+mailbox/[email protected]') // Return true
validMail('"very.(),:;<>[]\".VERY.\"very@\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}[email protected]') // Return true
validMail('"()<>[]:,;@\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"Abc@def"@example.com') // Return true
validMail('"Fred Bloggs"@example.com') // Return true
validMail('"Joe.\Blow"@example.com') // Return true
validMail('Loïc.Accentué@voilà.fr') // Return true
validMail('" "@example.org') // Return true
validMail('user@[IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

validMail('Abc.example.com') // Return false
validMail('A@b@[email protected]') // Return false
validMail('a"b(c)d,e:f;g<h>i[j\k][email protected]') // Return false
validMail('just"not"[email protected]') // Return false
validMail('this is"not\[email protected]') // Return false
validMail('this\ still\"not\[email protected]') // Return false
validMail('[email protected]') // Return false
validMail('[email protected]') // Return false

Покажи этот тест: https://regex101.com/r/LHJ9gU/1

ES6 образец

const validateEmail=(email)=> /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(email);

Теперь ReactNative версии 0.46 Используйте код ниже для проверки электронной почты.

 validateEmail = (email) => {
     var re = /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
     if (re.test(email)) {
     } else {
       alert('email: ' + "Please enter valid emailID.")
     }
 }

Вы также можете попробовать

var string = "[email protected]"
var exp = /(\w(=?@)\w+\.{1}[a-zA-Z]{2,})/i
alert(exp.test(string))

Обновление Regex 2018! попробуй это

let val = '[email protected]';
if (/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.info('passed');
}

машинописная версия завершена

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

подробнее https://git.io/vhEfc

 <input type = "email" class = "form-control" required = "required" placeholder = "Email Address" name = "Email" id = "Email" autocomplete = "Email">
 <button class = "btn-1 shadow-0 full-width" type = "button" id = "register">Register account</button>

 $("#register").click(function(){       
    var rea = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
    var Email = $("#Email").val();
    var x = rea.test(Email);
    if (!x) {
        alert('Type Your valid Email');
        return false;
    }           
 </script>

Вот простое регулярное выражение, которое просто проверяет базовый формат электронного письма, например, [email protected]:

\S+@\S+\.\S+

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

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

В чем проблема? Ну, «a_z%@gmail.com не может существовать, но он может существовать по адресу, подобному этому, через другого провайдера» [email protected].

Почему? Согласно RFC: https://en.wikipedia.org/wiki/Email_address#RFC_specification.

Я возьму отрывок для облегчения лекции:

The local-part of the email address may use any of these ASCII characters:

- uppercase and lowercase Latin letters A to Z and a to z;
- digits 0 to 9;
- special characters !#$%&'*+-/=?^_`{|}~;
- dot ., provided that it is not the first or last character unless quoted, and provided also that it does not appear consecutively unless quoted (e.g. [email protected] is not allowed but "John..Doe"@example.com is allowed);[6]
Note that some mail servers wildcard local parts, typically the characters following a plus and less often the characters following a minus, so fred+bah@domain and fred+foo@domain might end up in the same inbox as fred+@domain or even as fred@domain. This can be useful for tagging emails for sorting, see below, and for spam control. Braces { and } are also used in that fashion, although less often.
- space and "(),:;<>@[\] characters are allowed with restrictions (they are only allowed inside a quoted string, as described in the paragraph below, and in addition, a backslash or double-quote must be preceded by a backslash);
- comments are allowed with parentheses at either end of the local-part; e.g. john.smith(comment)@example.com and (comment)[email protected] are both equivalent to [email protected].

Итак, у меня может быть такой адрес электронной почты:

A__z/J0hn.sm{it!}[email protected]

Если вы попробуете этот адрес, я уверен, что он потерпит неудачу во всем или большей части регулярного выражения, размещенного по всей сети. Но помните, что этот адрес соответствует правилам RFC, поэтому он действителен.

Представьте мое разочарование из-за того, что я не могу зарегистрироваться нигде, проверенной с помощью этих регулярных выражений !!

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

Как быть с таким?

Практически во всех случаях не имеет значения, добавляет ли пользователь недействительный адрес электронной почты. Вы можете положиться на HTML 5 input type = "email", который запускает возле для RFC, мало шансов на ошибку. HTML5 input type = "email" информация: https://www.w3.org/TR/2012/WD-html-markup-20121011/input.email.html

Например, это действительный адрес электронной почты RFC:

"very.(),:;<>[]\".VERY.\"very@\ \"very\".unusual"@strange.example.com

Но проверка html5 скажет вам, что текст перед @ не должен содержать, например, символов "или ()", что на самом деле неверно.

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

Хорошей практикой при этом является ввод «введите адрес электронной почты еще раз», чтобы избежать ошибок ввода пользователем. Если вам этого недостаточно, добавьте модальное окно перед отправкой с заголовком «Это ваш текущий адрес электронной почты?», А затем письмо, введенное пользователем внутри тега h2, чтобы четко показать, какой адрес электронной почты -почта, которую они ввели, затем кнопка «да, отправить».

Как написать конкретное регулярное выражение в android или java.

1) USER_NAME = "^[A-Za-z0-9_-]{min number of character,max number of character}$";

2) TELEPHONE = "(^\+)?[0-9()-]*";

3) TELEPHONE_OPTIONAL = "^($|(^\+)?[0-9()-]*)$";

4) EMAIL = "[a-zA-Z0-9_\.\+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-\.]+";

5) EMAIL_OPTIONAL = "^($|[a-zA-Z0-9_\.\+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-\.]+)$";

6) WEB_URL = "^($|(http://|https://)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]{3}.?([a-z]+)?)$";

7) WEB_URL_YOUTUBE_BE = "https?\://(www\.)?youtu(\.)?be(\.com)?/.*(\?v=|/v/)?[a-zA-Z0-9_\-]+";

8) POSTAL_ADDRESS = "[a-zA-Z\d\s\-\,\#\.\+]+";

9) FIELD_NOT_EMPTY = "[^\s]*";

10) PINCODE = "^([0-9]{6})?$";

11) IFSC_CODE = "^[^\s]{4}\d{7}$";

12) SWIFT_CODE = "^([0-9]{10})?$";

13) PINCODE = "^([0-9]{6})?$";

Это перевод на JavaScript проверки, предложенной официальным руководством по Rails, используемым тысячами веб-сайтов:

/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i

Относительно простой, но проверяет самые распространенные ошибки.

Протестировано на наборе данных из тысяч писем, и у него нет ложных отрицательных / положительных результатов.

Пример использования:

const emailRegex = /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i;

emailRegex.test('[email protected]');    // true

// Multi-word domains
emailRegex.test('[email protected]');  // true
emailRegex.test('[email protected]'); // true

// Valid special characters
emailRegex.test('unusual+but+valid+email1900=/!#$%&\'*+-/=?^_`.{|}[email protected]') // true

// Trailing dots
emailRegex.test('[email protected].'); // false

// No domain
emailRegex.test('email@example');        // false

// Leading space
emailRegex.test(' [email protected]');   // false

// Trailing space
emailRegex.test('[email protected] ');   // false

// Incorrect domains
emailRegex.test('email@example,com ');   // false

// Other invalid emails
emailRegex.test('invalid.email.com')        // false
emailRegex.test('invalid@[email protected]') // false
emailRegex.test('[email protected]')       // false

Вот решение, которое работает и включает в себя функциональность проверки / уведомления в форме:

Можно запустить по этой ссылке

JAVASCRIPT

(function() {
  'use strict';

  window.addEventListener('load', function() {
    var form = document.getElementById('needs-validation');
    form.addEventListener('submit', function(event) {
      if (form.checkValidity() === false) {
        event.preventDefault();
      }
      form.classList.add('was-validated');
      event.preventDefault();              
    }, false);
  }, false);
})();

HTML

<p class='title'>
    <b>Email validation</b>
  <hr size = "30px;">
</p>
<br>

<form id = "needs-validation" novalidate>
  <p class='form_text'>Try it out!</p>
  <div class = "form-row">
    <div class = "col-12">
      <input type = "email" class = "form-control" placeholder = "Email Address" required>
        <div class = "invalid-feedback">
          Please enter a valid email address.
        </div>
    </div>
  <div class = "row">
    <div class = "col-12">
      <button type = "submit" 
          class = "btn btn-default btn-block">Sign up now
      </button>
    </div>
   </div>
</form>

Я написал валидатор электронной почты на JavaScript, который полностью совместим с реализацией PHP filter_var($value, FILTER_VALIDATE_EMAIL).

https://github.com/mpyw/FILTER_VALIDATE_EMAIL.js

import validateEmail from 'filter-validate-email'

const value = '...'
const result = validateEmail(value)

эквивалентно:

<?php

$value = '...';
$result = (bool)filter_var($value, FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_UNICODE);

function ValidateEmail(mail) 
{
  if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(myForm.emailAddr.value))
  {
    return (true)
  }
  alert("You have entered an invalid email address!")
  return (false)
}

Ссылка URL: https://www.w3resource.com/javascript/form/email-validation.php

Это работает для меня:

function Email(mail)
{
 if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(myForm.emailAddr.value))
  {
    return (true)
  }
    alert("Invalid email address!")
    return (false)
}

Часть personal_info содержит следующие символы ASCII.

  1. Прописные (A-Z) и строчные (a-z) английские буквы. Цифры (0-9).
  2. Символы ! # $% & '* + - / =? ^ _ `{| } ~
  3. Характер . (точка, точка или точка) при условии, что это не первый или последний символ, и они не будут идти один за другим.

Часть доменного имени [например, com, org, net, in, us, info] содержит буквы, цифры, дефисы и точки.

 function ValidateEmail(mail) 
{
 if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(myForm.emailAddr.value))
  {
    return (true)
  }
    alert("You have entered an invalid email address!")
    return (false)
}

Вы также можете использовать RegExp:

function validateEmail(str) {
    return new RegExp(/([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/, 'igm').test(str);
}

См. Руководство по регулярным выражениям в MDN для получения дополнительной информации.

Нет, это не сработает для многих активных электронных писем в мире и будет принимать электронные письма, которые невозможно, не используйте!

David Mårtensson 16.02.2021 21:26

Вот рекомендуемый шаблон Regex для HTML5 на MDN:

Browsers that support the email input type automatically provide validation to ensure that only text that matches the standard format for Internet e-mail addresses is entered into the input box. Browsers that implement the specification should be using an algorithm equivalent to the following regular expression:

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

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

Хороший. Вы когда-нибудь пробовали другие методы проверки, такие как службы PHP или API? Как DeBounce Подтверждение электронной почты Tool.

Iman Hejazi 09.03.2019 15:44

Вы просто используете https://github.com/chriso/validator.js и просто делаете:

var validator = require('validator');

validator.isEmail('[email protected]'); //=> true

Обратите внимание, что это может работать на клиенте.

Вот как я это делаю. Я использую match () для проверки стандартного шаблона электронной почты и добавляю класс к входному тексту, чтобы соответствующим образом уведомить пользователя. Надеюсь, это поможет!

$(document).ready(function(){
  $('#submit').on('click', function(){
      var email = $('#email').val();
      var pat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
      if (email.match(pat)){
        $('#email')
          .addClass('input-valid');
        return false;
      } else {
        $('#email')
        	.addClass('input-error')
          .val('');
        return false;
      }
  });
});
.input-error {
  border: 1px solid red;
  color: red;
}

.input-valid {
  border: 1px solid green;
  color: green;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
    <input type = "text" id = "email" placeholder = "[email protected]" class = "">
    <input type = "submit" id = "submit" value = "Send"/>
</form>

Вы когда-нибудь пробовали DeBounce Подтверждение электронной почты? Предлагаю взглянуть на это.

Iman Hejazi 04.03.2019 19:48

Есть моя версия валидатора электронной почты. Этот код выполнен с помощью объектно-ориентированного программирования и реализован как класс со статическими методами. Вы найдете две версии валидаторов: строгую (EmailValidator.validate) и добрую (EmailValidator.validateKind).

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

export class EmailValidator {
    /**
     * @param {string} email
     * @return {string}
     * @throws {Error}
     */
    static validate(email) {
        email = this.prepareEmail(email);

        const isValid = this.validateKind(email);

        if (isValid)
            return email;

        throw new Error(`Got invalid email: ${email}.`);
    }

    /**
     * @param {string} email
     * @return {boolean}
     */
    static validateKind(email) {
        email = this.prepareEmail(email);

        const regex = this.getRegex();

        return regex.test(email);
    }

    /**
     * @return {RegExp}
     * @private
     */
    static getRegex() {
        return /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    }

    /**
     * @param {string} email
     * @return {string}
     * @private
     */
    static prepareEmail(email) {
        return String(email).toLowerCase();
    }
}

Чтобы подтвердить электронную почту, вы можете использовать следующие способы:

// First way.

try {
    EmailValidator.validate('[email protected]');
} catch (e) {
    console.error(e.message);
}
// Second way.

const email = '[email protected]';
const isValid = EmailValidator.validateKind(email);

if (isValid)
    console.info(`Email is valid: ${email}.`);
else
    console.info(`Email is invalid: ${email}.`);

Я использую эту функцию

/**
 * @param {*} email
 */
export const validateEmail = email => {
    return new RegExp(/[\w-]+@([\w-]+\.)+[\w-]+/gm).test(email);
};

Не работает для Unicode. validateEmail('køkø@gmail.com') === false. Забудьте о проверке с помощью подобных проверок. Протестируйте @ и просто отправьте пользователю электронное письмо.

oligofren 24.09.2019 12:36

Обычное регулярное выражение электронной почты (официальный стандарт RFC 5322): https://emailregex.com/

JavaScript:

/^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

Найдите знак @ в поле ввода.

Этот! Это единственная действительная проверка, которая действительно не усложняет ситуацию. Если вы действительно хотите узнать, действителен ли электронный адрес, отправьте пользователю электронное письмо.

oligofren 24.09.2019 12:35

Если вы хотите, чтобы человек мог прочитать и поддерживать, я бы порекомендовал Парсер Масала (я один из создателей этого).

import {C,Streams} from '@masala/parser'

const illegalCharset = ' @\u00A0\n\t';
const extendedIllegalCharset = illegalCharset + '.';


// Assume '[email protected]'
export function simpleEmail() {

    return C.charNotIn(illegalCharset).rep() // 'nicolas'
        .then(C.char('@'))
        .then(subDns())  //'internal.masala.co.'
        .then(C.charNotIn(extendedIllegalCharset).rep()) //'uk'
        .eos(); // Must be end of the char stream
}

// [email protected] => extract 'internal.masala.co.'
function  subDns() {
    return C.charNotIn(extendedIllegalCharset).rep().then(C.char('.')).rep()
}

function validateEmail(email:string) {
    console.info(email + ': ' + (simpleEmail().parse(Streams.ofString(email)).isAccepted()));
}


validateEmail('[email protected]'); // True
validateEmail('nz@co.'); // False, trailing "."

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


function inQuote() {
    return C.char('"')
        .then(C.notChar('"').rep())
        .then(C.char('"'))
}

function allEmail() {

    return inQuote().or(C.charNotIn(illegalCharset))
        .rep() // repeat (inQuote or anyCharacter)
        .then(C.char('@'))
        .then(subDns())
        .then(C.charNotIn(extendedIllegalCharset).rep())
        .eos() // Must be end of the character stream
        // Create a structure
        .map(function (characters) { return ({ email: characters.join('') }); });
}

'"nicolas""love-quotes"@masala.co.uk' официально действителен, но должен ли он быть в вашей системе?

По крайней мере, с Масалой вы даете себе шанс понять это. И так на следующий год, коллега.

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

^[a-zA-Z0-9][a-zA-Z0-9-_\.]+@([a-zA-Z]|[a-zA-Z0-9]?[a-zA-Z0-9-]+[a-zA-Z0-9])\.[a-zA-Z0-9]{2,10}(?:\.[a-zA-Z]{2,10})?$

Используйте браузер / среду выполнения для обработки входных данных, добавляя протокол и передавая его в API URL, перехватывая любые ошибки и проверяя свойства результата username и hostname. Он будет обрабатывать в основном все преобразования и возможности (Punycode наборов символов и т. д.). Это только устанавливает, что ввод можно анализировать, но не является действительным - это возможно только путем проверки того, получает ли целевой компьютер сообщения для этого псевдонима. Тем не менее, это дает близкое (imo разумное) предположение и может быть расширено, чтобы быть более конкретным и реалистичным, если вам удобно как поддерживать его, так и рисковать недействительными отказами. (Обратите внимание, что он не пытается адресовать адреса IPv4 или IPv6, а просто широкий спектр сценариев, ориентированных на клиента, с использованием домена.)

function validEmail(email=''){
    var $0, url, isValid = false, emailPatternInput = /^[^@]{1,64}@[^@]{4,253}$/, emailPatternUrl = /^[^@]{1,64}@[a-z][a-z0-9\.-]{3,252}$/i;
    email = email.trim();
    try{
        url = new URL('http://'+email);
        $0 = `${url.username}@${url.hostname}`;
        isValid = emailPatternInput.test( email );
        if (!isValid) throw 'invalid email pattern on input:' + email;
        isValid = emailPatternUrl.test( $0 );
        if (!isValid) throw 'invalid email pattern on url:' + $0;
        console.info(`email looks legit "${email}" checking url-parts: "${$0 === email ? '-SAME-':$0}"`);
    }catch(err){
        console.error(`probably not an email address: "${email}"`, err);
    };
    return isValid;
}

['user+this@はじめよう.みんな', 'stuff@things', '[email protected]', 'Jean+Franç[email protected]','هيا@יאללה', '试@例子.测试.مثال.آزمایشی', 'not@@really', 'no'].forEach(email=>console.info(validEmail(email), email));

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

Также см. Документы URL MDN URL, window.URL и Nodejs для API URL.

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

function validateEmail(email){
        var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;

       //your custom code here to check your email address 

}

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

Gmail
/^[a-z]((?!\.\.)([a-z\.])){4,28}[a-z0-9]@gmail.com$/i

Yahoo
/^[a-z]((?!\.\.)([\w\.])){3,30}[\w]@yahoo.com$/i

Перспективы / Hotmail
/[a-z]((?!\.\.)([\w\.])){0,62}[\w]@(outlook.com|hotmail.com)$/i

Вы знаете, что \w уже включает \d и _? Пожалуйста, посмотрите эти сайты: Список TLD; действительные / недействительные адреса; регулярное выражение для адреса электронной почты RFC822

Toto 18.11.2019 15:50

@Toto, верно, я не знаю, как я его там потерял, я действительно использовал это регулярное выражение при работе с базой данных: \, еще раз спасибо.

Eboubaker 21.11.2019 19:30

Домен Gmail - это не @google.com, это @gmail.com или (для очень старых учетных записей) @googlemail.com.

David Wheatley 21.01.2020 20:36

Вы можете попробовать RegExp

function isValidEmail( value ) {
	return /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,5}$/.test( value );
}

console.info( isValidEmail("[email protected]") )

В моем случае я хотел избежать ~ и #, поэтому я использовал другое решение:

function validEmail(email){
  const regex = /^((?!\.)[\w-_.]*[^.])(@\w+)(\.\w+(\.\w+)?[^.\W])$/;
  return regex.test(email);
}

function validEmail(email){
  const regex = /^((?!\.)[\w-_.]*[^.])(@\w+)(\.\w+(\.\w+)?[^.\W])$/;
  return regex.test(email);
}

const emails = [
'[email protected]',
'[email protected]',
'[email protected]',
'pio_#[email protected]',
'pio_pio@#factory.com',
'[email protected]#om',
'[email protected]*om',
'pio^[email protected]'
]

for(const email of emails){
  document.write(email+' : '+validEmail(email)+'</br>');
}

Вы можете использовать это регулярное выражение (из w3resource (* не относится к W3C)):

/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(emailValue)

Если вы используете Node, вы можете использовать его как во внутреннем, так и во внешнем интерфейсе.

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

Это регулярное выражение не работает на «[email protected]» и «[email protected]». Не использовать.

Xizam 24.03.2020 14:15

добавление user + - действительный адрес электронной почты, и longdomain не обязательно недействителен.

Mattia Rasulo 08.01.2021 18:30

........точно

Xizam 08.01.2021 19:05

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

David Mårtensson 16.02.2021 21:30

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

Для проверки пользовательского интерфейса у меня хорошо получается простейшая проверка ищу знак @. Важно отметить, что я всегда выполняю проверку на стороне сервера с помощью стандартного «проверочного адреса электронной почты», который содержит уникальную ссылку для подтверждения пользователем своего адреса электронной почты.

if (email.indexOf('@') > 0)

Я намеренно выбрал 0 даже с отсчетом от нуля, так как он также гарантирует, что перед @ будет один символ.

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

function isValidEmail(value) {
    const atLocation = value.lastIndexOf("@");
    const dotLocation = value.lastIndexOf("."); 
    return (
        atLocation > 0 &&
        dotLocation > atLocation + 1 &&
        dotLocation < value.length - 1
    );
};
  • Получите расположение последнего символа "@" и последнего символа "."
  • Убедитесь, что "@" не является первым символом (перед ним что-то есть)
  • Убедитесь, что "." стоит после "@" и между ними есть хотя бы один символ
  • Убедитесь, что после "." Есть хотя бы один символ.

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

Это не удастся для писем, заканчивающихся комментарием, содержащим @, например "[email protected] (это @ комментарий)", который является действительным адресом электронной почты.

David Mårtensson 16.02.2021 21:42

Если вы получили эту ошибку: использование регулярных выражений зависит от безопасности.

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

Regex для проверки писем без (ReDoS):

/^[a-z0-9](?!.*?[^\na-z0-9]{2})[^\s@]+@[^\s@]+\.[^\s@]+[a-z0-9]$/

Пожалуйста, дайте мне знать, работает ли это решение для вас. Спасибо.

Большинство ответов здесь не подходят для линтера, это беспорядок! Некоторые из них тоже устарели! Потратив много времени, я решил использовать внешнюю библиотеку с именем email-validator, легко установить ее, например, с помощью npm и импортировать / потребовать ее в своем собственном проекте:

https://www.npmjs.com/package/email-validator

//NodeJs
const validator = require("email-validator");
validator.validate("[email protected]"); // true

//TypeScript/JavaScript
import * as EmailValidator from 'email-validator';
EmailValidator.validate("[email protected]"); // true

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

Stefan 20.10.2020 18:02

Мне тоже удалось сэкономить кучу времени.

jfriend00 14.11.2020 02:00

     // Html form call function name at submit button

    <form name = "form1" action = "#"> 
    <input type='text' name='text1'/>
    <input type = "submit" name = "submit" value = "Submit" 
    onclick = "ValidateEmail(document.form1.text1)"/>
   </from>

    // Write the function name ValidateEmail below

    <script>
     function ValidateEmail(inputText)
    {
  var mailformat = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
    if (inputText.value.match(mailformat))
    {
    alert("Valid email address!");
    document.form1.text1.focus();
    return true;
    }
    else
   {
    alert("You have entered an invalid email address!");
    document.form1.text1.focus();
    return false;
    }
    }
   </script>

Другие вопросы по теме