我有一个正则表达式验证我的邮件地址:
([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})(\]?)
这完全正常,但只允许输入一封电子邮件。现在我想扩展它并允许添加多个邮件地址(例如,就像MS Outlook一样),并使用分号作为邮件分割器。
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;
当用户只输入一封电子邮件时,这不是我想要的。
如何扩展我的正则表达式(第一个)以允许添加多个邮件地址,同时让它们通过分号分割?
答案 0 :(得分:50)
这是您的原始表达式,已更改为允许使用分号和(可选)除分号之外的空格分隔的多封电子邮件。它还允许一个不以分号结尾的电子邮件地址。
这允许空白条目(没有电子邮件地址)。您可以将最终*更改为+,以至少需要一个地址。
(([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评论中的状态,如果在正确的电子邮件地址列表之前或之后有其他文本,则验证不会失败。所以它可以作为“电子邮件搜索者”。要使其作为验证程序,您需要在正则表达式的开头添加^
,并在结尾处添加$
。这将确保表达式匹配所有文本。所以完整的reex将是:
^(([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*
而不是简单^
表达式已经在最后容忍空白。
答案 1 :(得分:3)
旧帖子 - 需要相同的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})+)*$
取自this post但是,接受的答案也不起作用,但是在帖子的链接上的正则表达式确实如此。
abc@abc.com
- 验证
abc@abc.com;123@qwer.com
- 验证
abc@abc.com;
- 未验证
empty string
- 验证
如果要对空字符串进行验证,请删除正则表达式开头的|
答案 2 :(得分:2)
为什么不拆分分号,然后使用现有的正则表达式验证每个潜在的电子邮件地址?我怀疑,编写一个巨大的正则表达式将是非常困难的维护噩梦。
答案 3 :(得分:2)
请试试这个
^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$
答案 4 :(得分:1)
域名实际上更复杂。例如,大多数TLD现在使用Unicode domain names,这在欧洲很常见。考虑电子邮件地址mailtest@пример.испытание,这实际上是完全有效的 (尽管它们总是transcribed to the old form - mailtest@xn--hxajbheg2az3al.xn--jxalpdlp)。这意味着可能更容易定义哪些字符不对域名有效。请参阅ICANNs。
此外,TLD也不是您定义的集合的严格组成部分,请参阅IANAs list of valid TLDs。例如,example @ example.travel是有效的电子邮件地址。
简而言之,要验证电子邮件地址,请考虑使用已建立的第三方库,除非您正在处理有限的特殊情况。
现在,对于您的原始问题,我建议您在预处理阶段拆分合理的分隔符(','和';'),修剪空格(至少在处理用户输入时)并验证每个条目。
答案 5 :(得分:0)
在一本旧的正则表达式中,他们声明你不能写一个正则表达式来匹配所有有效的电子邮件地址(虽然你可以接近)。
Here is a website处理正则表达式和电子邮件地址。
我建议您将字符串拆分为;
和,
边界,并分别检查每个电子邮件地址,使其与正则表达式有效/无效。
答案 6 :(得分:0)
我在我的日子里写过的东西。 基本电子邮件验证取自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])(;)?)+$
将电子邮件与;分隔符
我想要更多的分隔符交换(;)?用[;,|]?等等[]括号。
答案 7 :(得分:0)
以下是我的解决方案,它对我有用:
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;
}
}
答案 8 :(得分:0)
这是一个简单的程序,它可以在不使用正则表达式的情况下为您执行此操作。实际上它确实使用正则表达式,但我们不必担心它看起来如何.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;
}
您必须用分号分隔电子邮件。
答案 9 :(得分:0)
这是一个非常古老的问题,但我想我会分享我的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);
}
}
}