Regex pour la validation de plusieurs adresses E-Mail

j'ai reçu un Regex qui valide mes adresses postales comme ceci:

([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})(]?)

cela fonctionne parfaitement bien, mais permet seulement un e-mail à entrer. Maintenant, j'ai voulu étendre cela et permettre plusieurs adresses de courrier à ajouter (tout comme MS Outlook, par exemple) avec un point-virgule comme un mail-splitter.

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

J'ai cherché et trouvé celui-ci:

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

cela fonctionne sur un point, mais malheureusement nécessite un point-virgule à la fin d'un courrier:

mail1@tld.com;

ce n'est pas ce que je veux quand l'utilisateur entre seulement un e-mail.

Comment puis-je étendre mon regex ci-dessus (le premier) pour permettre l'ajout de plusieurs adresses postales tout en les séparant par un point-virgule?

21
demandé sur SeToY 2012-03-21 21:02:10

10 réponses

il s'agit de votre expression originale, modifiée de sorte qu'elle autorise plusieurs e-mails séparés par un point-virgule et (éventuellement) des espaces en plus du point-virgule. Il permet également une adresse mail qui n'est pas au point-virgule.

permet des entrées en blanc (pas d'adresse e-mail). Vous pouvez modifier la finale * en + d'exiger au moins une adresse.

(([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*$))*

si vous devez autoriser la virgule, en dehors du point-virgule, Vous pouvez cocher ce groupe:

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

par celui-ci:

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

Remarque importante: comme L'indique le commentaire de Martin, s'il y a du texte supplémentaire avant ou après la liste d'adresses e-mail correcte, la validation n'échouera pas. Cela fonctionnerait donc comme un"chercheur d'e-mails". Pour qu'il fonctionne en tant que validateur, vous devez ajouter ^ au début du regex, et $ à la fin. Cela permettra de s'assurer que l'expression correspond à tout le texte. L'réexe serait:

^(([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*$))*$

vous pouvez ajouter un \s* après le ^ pour tolérer les blancs au début de la liste, comme ceci. I. e. inclure ^\s* au lieu de simplement ^ L'expression déjà tolère les blancs à la fin.

46
répondu JotaBe 2016-06-16 09:13:47

Old post - besoin de la même RegEx. La réponse acceptée n'a pas fonctionné pour moi, cependant, cela a fonctionné.

^(|([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})+)*$

Extrait de ce post , cependant, l'on a accepté la réponse n'a pas de travail, soit, mais les Regex sur le lien DANS le post n'.

abc@abc.com - valide

abc@abc.com;123@qwer.com - valide

abc@abc.com; - ne valide pas

empty string - valide

si vous voulez valider par rapport à une chaîne vide, supprimez le | au début du regex

3
répondu Rob Scott 2017-05-23 10:31:19

pourquoi ne pas simplement diviser sur le point-virgule et ensuite valider chaque adresse e-mail potentielle en utilisant votre regexp existant ? Écrire un grand regexp va être très difficile et un cauchemar de maintenance, je suppose.

2
répondu Brian Agnew 2012-03-21 17:04:08

s'il vous Plaît essayer cette

^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$
2
répondu PraveenVenu 2012-03-21 17:04:21

les noms de domaines sont en fait beaucoup plus complexes. Par exemple , la plupart des TLD utilisent désormais les noms de domaine Unicode , qui sont assez courants en Europe. Considérez l'adresse email mailtest@пример.испытание, qui est en fait parfaitement valide (bien qu'ils puissent toujours être transcrits à l'ancienne forme - mailtest@xn--hxajbheg2az3al.xn--jxalpdlp). Cela signifie qu'il est probablement plus facile de définir ce que les caractères sont pas valide pour un nom de domaine. Voir ICANNs .

en outre, les TLD ne font pas non plus strictement partie de l'ensemble que vous avez défini, voir ianas liste des TLD valides . Par exemple, example@example.travel est une adresse e-mail valide.

en bref, pour valider les adresses e-mail, envisagez de vous adresser à une bibliothèque tierce établie, à moins que vous ne traitiez d'un cas spécial limité.

maintenant pour votre question originale, je recommande une étape de pré-processus où vous vous divisez sur des délimiteurs raisonnables ( ' , ' et ';'), trim whitespace (au moins s'il s'agit d'une entrée utilisateur) et valider chaque entrée.

1
répondu Krumelur 2012-03-21 17:34:42

dans un vieux livre regex ils ont déclaré que vous ne pouvez pas écrire un regex pour correspondre tous adresses e-mail valides (bien que vous pouvez venir près).

voici un site web traitant des adresses regex et e-mail.

je vous recommande de diviser la chaîne de caractères aux limites ; et , et de vérifier chaque adresse e-mail séparément pour être valide/invalide avec votre regex.

0
répondu Uwe Keim 2012-03-21 17:07:45

ci-dessous est ma solution et il a fonctionné comme prévu pour moi:

      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
répondu Qasim Bataineh 2015-12-22 19:13:16

quelque chose que j'ai écrit de mon temps. La validation e-mail de base est tirée de la mise en œuvre pratique de 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])(;)?)+$

correspond aux e-mails avec; séparateur

je vous en voulez plus séparateurs de swap (;)? avec [;,|]? etc à l'intérieur des crochets [].

0
répondu Shuffler 2016-03-16 18:48:02

voici un programme simple qui le fait pour vous sans utiliser l'Expression régulière.Eh bien en Fait, il utilise une expression régulière, mais nous n'avons pas à vous soucier de la façon dont il regarde .php le fait pour nous .

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;



}

Vous devez séparer vos e-mails par un point virgule.

0
répondu 2016-11-24 19:35:05

c'est une très vieille question, mais j'ai pensé que je partagerais mon C# code.

j'ai décidé de discuter par le point-virgule puis vérifier chaque e-mail individuellement:

        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
répondu Jacob Morris 2017-06-16 13:30:38