Regex,用于验证多个电子邮件地址
本文关键字:电子邮件地址 验证 用于 Regex | 更新日期: 2023-09-27 18:28:27
我得到了一个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})(']?)
这非常好,但只允许输入一封电子邮件。现在我想扩展它,并允许添加多个邮件地址(例如,就像MSOutlook一样),使用分号作为邮件拆分器。
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;
当用户只输入一封电子邮件时,这不是我想要的。
如何扩展上面的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})(']?)('s*;'s*|'s*$))*
如果你需要允许逗号,除了分号,你可以更改这个组:
('s*;'s*|'s*$)
由这个:
('s*(;|,)'s*|'s*$)
重要提示:正如Martin在评论中所说,如果在正确的电子邮件地址列表之前或之后有额外的文本,验证不会失败。因此,它可以作为"电子邮件搜索器"工作。要使其作为验证器工作,您需要在正则表达式的开头添加^
,并在末尾添加$
。这将确保表达式与所有文本匹配。因此,完整的正则表达式是:
^(([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*
而不是简单的^
。表达式已经按原样容忍末尾的空格。
旧post需要相同的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})+)*$
然而,从这篇帖子中检索到的公认答案也不起作用,但帖子中链接上的Regex起了作用。
abc@abc.com
-验证
abc@abc.com;123@qwer.com
-验证
abc@abc.com;
-不验证
empty string
-验证
如果要根据空字符串进行验证,请删除正则表达式开头的|
请尝试此
^(['w+-.%]+@['w-.]+'.[A-Za-z]{2,4};?)+$
为什么不在分号上拆分,然后使用现有的regexp验证每个潜在的电子邮件地址?我怀疑,编写一个巨大的正则表达式将非常困难,而且是一场维护噩梦。
域名实际上要复杂得多。例如,大多数顶级域名现在都使用Unicode域名,这在欧洲很常见。考虑一下电子邮件地址mailtest@пример.испырание,它实际上是完全有效的(尽管它们总是可以转录成旧形式——mailtest@xn--hxajbheg2az3al.xn--jxalpdlp)。这意味着,定义哪些字符对域名无效可能更容易。参见ICANN。
此外,TLD也不是您定义的集合的严格组成部分,请参阅有效TLD的IANA列表。例如example@example.travel是一个有效的电子邮件地址。
简而言之,要验证电子邮件地址,请考虑使用已建立的第三方库,除非您正在处理有限的特殊情况。
现在,对于您最初的问题,我建议您在预处理阶段拆分合理的分隔符(","answers";"),修剪空白(至少在处理用户输入时),并验证每个条目。
在一本旧的正则表达式书中,他们说你不能写一个正则表达式来匹配所有有效的电子邮件地址(尽管你可以接近)。
这是一个处理正则表达式和电子邮件地址的网站。
我建议您在;
和,
边界处拆分字符串,并使用正则表达式分别检查每个电子邮件地址是否有效。
我这几天写的东西。基本的电子邮件验证来自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])(;)?)+$
将电子邮件与匹配;分离器
我想要更多的分隔符,交换(;)?使用[;,|]?[]括号内。
以下是我的解决方案,它对我来说如预期:
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;
}
}
这里有一个简单的程序,它可以在不使用正则表达式的情况下为您实现这一点。实际上,它确实使用了正则表达式,但我们不必担心它的外观。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.     ".$value;
break;
}
}
echo $msg;
}
你必须用分号分隔你的电子邮件。
这是一个很老的问题,但我想我应该分享我的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);
}
}
}
^(|([a-zA-Z0-9_''-''.]+)@([a-zA-Z0-9_-''.]+
这对我来说很好。它满足逗号分隔的前/后空格。添加了双斜杠''而不是单斜杠'',因为单斜杠会出错,但无法在此处发布