Javascript Regex:允许多封电子邮件以分隔;(分号)和允许空白/空值

Javascript Regex:允许多封电子邮件以分隔;(分号)和允许空白/空值,javascript,angularjs,regex,validation,Javascript,Angularjs,Regex,Validation,这是我的正则表达式: var emailsRegex = /^[\W]*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4}[\W]*;{1}[\W]*)*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4})[\W]*$/; 目前,它允许完全限定的单个电子邮件和用分号分隔的多个电子邮件,例如: email1@hi.com email1@hi.com; email2@hi.com email1@hi.com; email2@hi.com; email3@

这是我的正则表达式:

var emailsRegex = /^[\W]*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4}[\W]*;{1}[\W]*)*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4})[\W]*$/;
目前,它允许完全限定的单个电子邮件和用分号分隔的多个电子邮件,例如:

email1@hi.com  
email1@hi.com; email2@hi.com
email1@hi.com; email2@hi.com; email3@hi.com
…都是有效的

我希望它保持不变,但也允许空白/空输入。我的表单使用空白输入字段标记$invalid,即使未在输入字段上指定
required
属性

我怀疑这是因为它没有通过正则表达式验证。谢谢

。首先,你的正则表达式是错误的(它不会匹配像
foo这样的电子邮件)+bar@example.org
对于RFC822和更新的RFC,这是完全有效的)。你最好使用像或这样的库来检查电子邮件

然后,您所要做的就是使用
email_string.split(“;”)
在每封电子邮件周围分割字符串,并对每封电子邮件应用检查程序


HTH

我最终使用了string.split(;),然后通过了一个改进的正则表达式,它应该占到今天使用的电子邮件地址的99%。我是在一个角度指令内做的

它允许空输入,多封电子邮件用
分隔符合大多数电子邮件地址使用的RFC

HTML


安格拉斯

angular.module('my-app')
.directive('multipleEmails', function () {
  return {
      require: 'ngModel',
      link: function (scope, element, attrs, ctrl) {
          ctrl.$parsers.unshift(function (rawInput) {

              var emails = rawInput.split(';');
              //console.log(emails);

              // Consider not using complex regex validation for emails. See: https://davidcel.is/posts/stop-validating-email-addresses-with-regex/
              // Instead, consider just checking for an "@" and a "." and call it a done. The mail daemon will return whether its a valid or invalid/bounced email address
              //var emailsRegex = /.+@.+\..+/i;

              // define single email validator here
              var regexPattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

              // angular.foreach(emails, function() {
              var validityArr = emails.map(function (str) {
                  if (rawInput) {
                      return regexPattern.test(str.trim());

                  } else if (!rawInput) {
                      return true;
                  }
              }); // sample return is [true, true, true, false, false, false]

              //console.log(emails, validityArr);
              var atLeastOneInvalid = false;

              angular.forEach(validityArr, function (value) {
                  if (value === false)
                      atLeastOneInvalid = true;
              });

              if (!atLeastOneInvalid) {
                  // ^ all I need is to call the angular email checker here, I think.
                  ctrl.$setValidity('multipleEmails', true);
                  return rawInput;
              } else {
                  ctrl.$setValidity('multipleEmails', false);
                  return undefined;
              }

          });
      }
  };
});
angular.module('my-app'))
.directive('multipleEmails',函数(){
返回{
要求:'ngModel',
链接:函数(范围、元素、属性、ctrl){
ctrl.$parsers.unshift(函数(rawInput){
var=rawInput.split(“;”);
//控制台日志(电子邮件);
/考虑不要对电子邮件使用复杂的正则表达式验证。请参见:https://davidcel.is/posts/stop-validating-email-addresses-with-regex/
相反,考虑只检查一个“@”和“a”。然后调用它完成。邮件守护进程将返回它的有效或无效/跳转电子邮件地址。
//var emailsRegex=/.+@.+\..+/i;
//在此定义单个电子邮件验证程序
变量regexpatern=/^([^()\[\]\\,;:\s@“]+(\.[^()\[\]\\,;:\s@“]+)*(“+”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}]);([a-zA Z-0-9]+-zA 2]);
//angular.foreach(电子邮件、函数(){
var validityar=emails.map(函数(str){
如果(输入){
返回regexptern.test(str.trim());
}如果(!rawInput){
返回true;
}
});//样本返回为[真,真,真,假,假,假]
//控制台日志(电子邮件、验证码);
var atLeastOneInvalid=false;
角度forEach(有效值、函数(值){
如果(值===false)
atLeastOneInvalid=true;
});
如果(!AtlastoneInvalid){
//^我想我只需要打电话给这里的电子邮件检查器。
ctrl.$setValidity('multipleEmails',true);
返回原始输入;
}否则{
ctrl.$setValidity('multipleEmails',false);
返回未定义;
}
});
}
};
});

试试这个/([^your regex,]\/*/gAs回答说,使用正则表达式来验证电子邮件充满了危险。你最多应该检查以确保
@
存在。之后,验证地址的唯一真正方法是发送电子邮件。我喜欢检查
@
-并且允许空-正则表达式用于什么?
/.++.+\..+/i
有效,但它仍然不允许为空。谢谢你,我正在阅读你的文章建议,很快就会回来接受。这篇文章很有意义。但是我不想仅仅为了查看电子邮件而包含另一个库。我更喜欢他们的建议,只检查
@
和call它是有效的。那么我如何使这个正则表达式允许为空或任何带有
的东西呢?他推荐的
/.++.++.++.++.++/I
会进行检查,但不允许为空。哦,你可以试试
/(.++.++.+.+.+.+)/I
这个
()
会对整个模式进行分组,并且
()?
将使其匹配正则表达式本身的
0
1
倍。
angular.module('my-app')
.directive('multipleEmails', function () {
  return {
      require: 'ngModel',
      link: function (scope, element, attrs, ctrl) {
          ctrl.$parsers.unshift(function (rawInput) {

              var emails = rawInput.split(';');
              //console.log(emails);

              // Consider not using complex regex validation for emails. See: https://davidcel.is/posts/stop-validating-email-addresses-with-regex/
              // Instead, consider just checking for an "@" and a "." and call it a done. The mail daemon will return whether its a valid or invalid/bounced email address
              //var emailsRegex = /.+@.+\..+/i;

              // define single email validator here
              var regexPattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

              // angular.foreach(emails, function() {
              var validityArr = emails.map(function (str) {
                  if (rawInput) {
                      return regexPattern.test(str.trim());

                  } else if (!rawInput) {
                      return true;
                  }
              }); // sample return is [true, true, true, false, false, false]

              //console.log(emails, validityArr);
              var atLeastOneInvalid = false;

              angular.forEach(validityArr, function (value) {
                  if (value === false)
                      atLeastOneInvalid = true;
              });

              if (!atLeastOneInvalid) {
                  // ^ all I need is to call the angular email checker here, I think.
                  ctrl.$setValidity('multipleEmails', true);
                  return rawInput;
              } else {
                  ctrl.$setValidity('multipleEmails', false);
                  return undefined;
              }

          });
      }
  };
});