Regex для проверки нескольких адресов электронной почты - PullRequest
23 голосов
/ 21 марта 2012

Я получил 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) с точкой с запятой в качестве разделителя почты.

mail1@tld.com;mail2@tld.com;mail3@tld.com

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

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

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

mail1@tld.com;

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

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

Ответы [ 10 ]

52 голосов
/ 21 марта 2012

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

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

(([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* после ^, чтобы допустить пробелы в начале списка, как это.То есть включите ^\s* вместо простого ^ Выражение уже допускает пробелы в конце как есть.

3 голосов
/ 26 марта 2015

Старый пост - нужен тот же 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})+)*$

Получено из этого поста , однако принятый ответ также не сработал, но регулярное выражение по ссылке ВНУТРИ сообщения.

abc@abc.com - подтверждает

abc@abc.com;123@qwer.com - подтверждает

abc@abc.com; - не проверяет

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

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

2 голосов
/ 21 марта 2012

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

^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$
2 голосов
/ 21 марта 2012

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

1 голос
/ 21 марта 2012

Доменные имена на самом деле намного сложнее.Например, большинство доменов верхнего уровня в настоящее время используют доменные имена Unicode , которые довольно распространены в Европе.Рассмотрим адрес электронной почты mailtest@пример.испытание, который на самом деле совершенно действителен (хотя они всегда могут быть переведены в старую форму - mailtest@xn--hxajbheg2az3al.xn--jxalpdlp).Это означает, что, вероятно, легче определить, какие символы не действительны для доменного имени.См. ICANN .

. Кроме того, TLD также не являются строго определенной частью набора, который вы определили, см. Список действительных TLD IANAs .Например, example@example.travel является действительным адресом электронной почты.

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

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

0 голосов
/ 16 июня 2017

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

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

        string toAddress = "testemail@gmail.com;test2@testing.com;";
        Regex rgx = new Regex(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[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);


                }
            }
        }
0 голосов
/ 24 ноября 2016

Вот простая программа, которая делает это для вас без использования регулярного выражения. Ну, на самом деле она использует регулярное выражение, но нам не нужно беспокоиться о том, как это выглядит .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;



}

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

0 голосов
/ 22 декабря 2015

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

      var emailReg = new RegExp(/^([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6})*([,;][\s]*([A-Z0-9.%+-]+@@[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;
    }
}
0 голосов
/ 30 августа 2013

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

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

Я хочу, чтобы разделители поменялись местами (;)?с [;, |]?и т. д. в скобках [].

0 голосов
/ 21 марта 2012

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

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

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

...