¿Cómo validar múltiples correos electrónicos usando Regex?

Después de una búsqueda rápida en Stackoverflow, no pude encontrar ninguna solución para la validation múltiple de correo electrónico usando regex (la function dividida de JS no es aplicable, pero hay razones por las cuales el back-end de la aplicación espera una cadena con correos separados por ; )

Aquí están los requisitos:

  1. Los correos electrónicos deben validarse con la siguiente regla: [A-Za-z0-9\._%-]+@[A-Za-z0-9\.-]+\.[A-Za-z]{2,4}
  2. Regex debería aceptar ; firmar como separador
  3. Los correos electrónicos se pueden escribir en varias líneas, terminando con ;
  4. Regex puede aceptar el final de la línea como ;

Se me ocurrió esta solución:

 ^ [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}?) *

pero no funciona para el punto # 3-4

Así que aquí están los casos que están bien:

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

Aquí hay casos que definitivamente NO ESTÁN BIEN:

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

Todo tipo de ayuda será apreciada

 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] 

Así es como lo estoy haciendo (aplicación ASP.Net, no jQuery). La list de direcciones de correo electrónico se ingresa en un textbox de varias líneas:

 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 ; } 

No hay ninguna razón para no usar split, de la misma manera que lo hará obviamente el back-end.

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

Para expresiones regulares de correo electrónico buenas o no tan buenas, eche un vistazo a ¿ Validar la dirección de correo electrónico en JavaScript? .