Подтвердить что ты не робот

Regex для проверки нескольких адресов электронной почты

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

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

Это работает отлично, но только позволяет вводить одно электронное письмо. Теперь я хотел расширить это и позволить добавлять несколько почтовых адресов (например, MS Outlook, например) с точкой с запятой в качестве разделителя почты.

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

Теперь я искал и нашел это:

([A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}(;|$))

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

[email protected];

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

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

4b9b3361

Ответ 1

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

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

(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*

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

(\s*;\s*|\s*$)

следующим образом:

(\s*(;|,)\s*|\s*$)

Важное примечание: как указано в комментарии Мартина, если есть дополнительный текст до или после правильного списка адресов электронной почты, проверка не завершится. Таким образом, это будет работать как "поисковик электронной почты". Чтобы заставить его работать как валидатор, вам нужно добавить ^ в начало регулярного выражения и $ в конце. Это обеспечит соответствие выражения всем текстам. Таким образом, полный reex будет:

^(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*$

Вы можете добавить дополнительный \s* после ^, чтобы переносить пробелы в начале списка, например. То есть include ^\s* вместо просто ^ Выражение уже допускает пробелы в конце как есть.

Ответ 2

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

Ответ 3

Пожалуйста, попробуйте

^([\w+-.%][email protected][\w-.]+\.[A-Za-z]{2,4};?)+$

Ответ 4

Доменные имена на самом деле более сложны. Например, большинство доменов верхнего уровня теперь используют Unicode domain names, которые довольно распространены в Европе. Рассмотрим адрес электронной почты [email protected]пример.испытание, которое действительно отлично  (хотя они всегда могут быть переписаны в старую форму - [email protected]). Это означает, что, вероятно, проще определить, какие символы недействительны для имени домена. См. ICANN.

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

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

Теперь для вашего первоначального вопроса я бы рекомендовал этап препроцесса, в котором вы делитесь на разумные разделители (',' и ';'), обрезаете пробелы (по крайней мере, имея дело с пользовательским вводом) и проверяете каждую запись.

Ответ 5

Старый пост - нужен тот же RegEx. Однако принятый ответ не помог мне.

^(|([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$

Получено из этого сообщения, однако принятый ответ тоже не сработал, но Regex по ссылке WITHIN the post сделал.

[email protected] - проверяет

[email protected];[email protected] - проверяет

[email protected]; - не проверяет

empty string - проверяет

Если вы хотите проверить на пустую строку, удалите | в начале регулярного выражения

Ответ 6

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

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

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

Ответ 7

То, что я написал в мои дни. Основная проверка электронной почты взята из практической реализации 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])(;)?)+$

соответствует электронной почте; разделитель

Мне нужно больше разделителей swap (;)? с [;, |]? и т.д. с помощью скобок [].

Ответ 8

Ниже мое решение, и он работал как ожидалось для меня:

      var emailReg = new RegExp(/^([A-Z0-9.%+-][email protected]@[A-Z0-9.-]+.[A-Z]{2,6})*([,;][\s]*([A-Z0-9.%+-][email protected]@[A-Z0-9.-]+.[A-Z]{2,6}))*$/i);
  var emailText = $('#email').val();

  if (!emailReg.test(emailText)) {
      alert('Wrong Email Address\Addresses format! Please reEnter correct format');
        return false;
    }
}

Ответ 9

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

public function test_reg()

{

   $email_list = '';

        $array = explode(";",$email_list);

        foreach ($array as $value)
         {
            $value;

            if (!filter_var($value, FILTER_VALIDATE_EMAIL) === false)
             {
                 $msg =  "Email List Contains  valid email addresses.";
              } 
            else
             {
                 $msg ="Your Email list contains an invalid email at. &nbsp&nbsp &nbsp".$value;
                 break;
             }  
         }

                echo $msg;



}

Вам нужно отделить свои письма с помощью двоеточия.

Ответ 10

Это очень старый вопрос, но я решил поделиться своим кодом на С#.

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

        string toAddress = "[email protected];[email protected];";
        Regex rgx = new Regex(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)[email protected][a-z0-9-]+(\.[a-z0-9-]+)*$");
        List<string> emailArray = new List<string>();

        if(toAddress != null && toAddress != "")
        {
            if (toAddress.IndexOf(";") != -1)
            {
                emailArray = toAddress.Replace(" ","").Split(';').ToList();
            }
            else
            {
                emailArray.Add(toAddress);
            }


            foreach (string email in emailArray)
            {

                if (rgx.IsMatch(email ?? ""))
                {
                    SendEmail(email, subject, body);


                }
            }
        }