用于匹配多个电子邮件的正则表达式

时间:2013-09-26 22:19:57

标签: c# .net regex

现在我有正则表达式\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*来匹配电子邮件地址,这种情况很好。

我已经为csv细胞匹配尝试了各种各样的东西,但我似乎无法让它们为此工作。

我需要的是与上面的正则表达式匹配的东西,但是之间有分隔符,有三个不同的分隔符'|' ',' ';',例如我想匹配

example@example.com

example@example.com|example@example.com|example@example.com

example@example.com,example@example.com,example@example.com

example@example.com;example@example.com;example@example.com

我也不关心空白,因此需要考虑添加额外的空格,同时还要考虑上面的空格,例如:

example@example.com | example@example.com|example@example.com

它还需要能够使用分隔符的组合

example@example.com,example@example.com;example@example.com|example@example.com

我在c#

中这样做

注意,我查看了这个How to match a comma separated list of emails with regex?

但我不确定如何修改^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4},?)+$以满足我的需求

目前我有

(\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*[\s?[,|\||;|]\s?]?)+$

4 个答案:

答案 0 :(得分:1)

我会使用String.Split()MailAddress构造函数的组合。像这样:

public bool ValidAddressText(string input)
{
    string[] addresses = input.Split(new Char[] { ',', ';', '|' });
    foreach (string address in addresses)
    {
        address = address.Trim();
        try
        {
            if (address == "")
            {
                return false;
            }

            new MailAddress(address);
        }
        catch(FormatException)
        {
            return false;
        }
    }

    return true;
}

随着.NET Framework的更新,这将捕获正则表达式不会出现的所有边缘情况,甚至会随着时间的推移而变得更好。它还简化了分隔符和空格的处理。

答案 1 :(得分:0)

尝试这样的事情(;|\||,)

我推荐使用工具RegExBuddy,你可以尝试使用这个简单的模式,这对我来说总是一个很好的帮助,以获得正确的模式!有一个试用版!

答案 2 :(得分:0)

我想出了这个:

(\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\s?[,|\||;|]\s?)?)+$

我认为这可以解决我的问题,有什么建议吗?

答案 3 :(得分:0)

我会使用lookbehind和lookahead:

(?<=\s|\||;|,|^)[\w.+-]+@(?:[\w-]+\.){1,2}(?:[a-z]{2,6})(?:\.[a-z]{2,6})?(?=\s|\||;|,|$)

您可以测试此正则表达式here