Как проверить несколько писем с помощью Regex? - PullRequest
4 голосов
/ 20 марта 2012

После быстрого исследования Stackoverflow я не смог найти никакого решения для проверки нескольких адресов электронной почты с использованием регулярных выражений (функция split JS неприменима, но по какой-то причине серверная часть приложения ожидает строку с сообщениями электронной почты).разделены ;).

Вот требования:

  1. Письма должны быть проверены с использованием следующего правила: [A-Za-z0-9\._%-]+@[A-Za-z0-9\.-]+\.[A-Za-z]{2,4}
  2. Regex должно принять ; подписать в качестве разделителя
  3. Письма могут быть записаны в несколько строк, заканчивая ;
  4. Regex может принять конец строки как ;

Я придумаю это решение:

^[A-Za-z0-9\._%-]+@[A-Za-z0-9\.-]+\.[A-Za-z]{2,4}(?:[;][A-Za-z0-9\._%-]+@[A-Za-z0-9\.-]+\.[A-Za-z]{2,4}?)*

, но оно не работает для пункта # 3-4

Так что вот случаи, которые в порядке:

 1. john@smith.com;john@smith.com
 2. john@smith.com;john@smith.com;
 3. john@smith.com;
    john@smith.com;
    jjoh@smith.com;

Вот случаи, которые определенно НЕ в порядке:

  1. john@smith.com jackob@smith.com
  2. jackob@smith.com,
  3. daniels@mail.com
     smth@mail.com

Буду признателен за любую помощь

Ответы [ 3 ]

2 голосов
/ 31 августа 2012

Вот как я это делаю (приложение ASP.Net, нет jQuery).Список адресов электронной почты вводится в многострочное текстовое поле:

function ValidateRecipientEmailList(source, args)
{
  var rlTextBox     = $get('<%= RecipientList.ClientID %>');
  var recipientlist = rlTextBox.value;
  var valid         = 0;
  var invalid       = 0;

  // Break the recipient list up into lines. For consistency with CLR regular i/o, we'll accept any sequence of CR and LF characters as an end-of-line marker.
  // Then we iterate over the resulting array of lines
  var lines = recipientlist.split( /[\r\n]+/ ) ;
  for ( i = 0 ; i < lines.length ; ++i )
  {
    var line = lines[i] ; // pull the line from the array

    // Split each line on a sequence of 1 or more whitespace, colon, semicolon or comma characters.
    // Then, we iterate over the resulting array of email addresses
    var recipients = line.split( /[:,; \t\v\f\r\n]+/ ) ;
    for ( j = 0 ; j < recipients.length ; ++j )
    {
      var recipient = recipients[j] ;

      if ( recipient != "" )
      {
        if ( recipient.match( /^([A-Za-z0-9_-]+\.)*[A-Za-z0-9_-]+\@([A-Za-z0-9_-]+\.)+[A-Za-z]{2,4}$/ ) )
        {
          ++valid ;
        }
        else
        {
          ++invalid ;
        }
      }
    }

  }

  args.IsValid = ( valid > 0 && invalid == 0 ? true : false ) ;
  return ;
}
1 голос
/ 21 марта 2012

Нет причин не использовать сплит - точно так же, как и бэкэнд.

return str.split(/;\s*/).every(function(email) {
    return /.../.test(email);
}

Для хороших или не очень хороших писем регулярные выражения взгляните на Проверить адрес электронной почты в JavaScript? .

1 голос
/ 21 марта 2012
var email = "[A-Za-z0-9\._%-]+@[A-Za-z0-9\.-]+\.[A-Za-z]{2,4}";
var re = new RegExp('^'+email+'(;\\n*'+email+')*;?$');

[ "john@smith.com;john@smith.com",
  "john@smith.com;john@smith.com;",
  "john@smith.com;\njohn@smith.com;\njjoh@smith.com",
  "john@smith.com jackob@smith.com",
  "jackob@smith.com,",
  "daniels@mail.com\nsmth@mail.com" ].map(function(str){
    return re.test(str);
}); // [true, true, true, false, false, false]
...