电子邮件地址拆分

Jam*_*ees 10 c#

所以我有一个字符串,我需要用分号分割

电子邮件地址: "one@tw;,.'o"@hotmail.com;"some;thing"@example.com

这两个电子邮件地址都有效

所以我希望List<string>得到以下内容:

  • "one@tw;,.'o"@hotmail.com
  • "some;thing"@example.com

但我目前分割地址的方式不起作用:

var addresses = emailAddressString.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(x => x.Trim()).ToList();
Run Code Online (Sandbox Code Playgroud)

由于多个;字符,我最终得到了无效的电子邮件地址.

我已经尝试了几种不同的方法,如果字符串包含引号然后找到;字符的索引并按照这种方式进行处理,我会尝试下去,但这真的很痛苦.

有没有人有更好的建议?

das*_*ght 13

假设不允许使用双引号,除了"at"符号前面的开始和结束引号之外@,您可以使用此正则表达式来捕获电子邮件地址:

((?:[^@"]+|"[^"]*")@[^;]+)(?:;|$)
Run Code Online (Sandbox Code Playgroud)

我们的想法是在之前捕获未[^@"]+引用的或引用的"[^"]*"部分@,然后将所有内容捕获到分号;或结束锚$.

正则表达式的演示.

var input = "\"one@tw;,.'o\"@hotmail.com;\"some;thing\"@example.com;hello@world";
var mm = Regex.Matches(input, "((?:[^@\"]+|\"[^\"]*\")@[^;]+)(?:;|$)");
foreach (Match m in mm) {
    Console.WriteLine(m.Groups[1].Value);
}
Run Code Online (Sandbox Code Playgroud)

此代码打印

"one@tw;,.'o"@hotmail.com
"some;thing"@example.com
hello@world
Run Code Online (Sandbox Code Playgroud)

演示1.

如果您希望在双引号内允许转义双引号,则可以使用更复杂的表达式:

((?:(?:[^@\"]|(?<=\\)\")+|\"([^\"]|(?<=\\)\")*\")@[^;]+)(?:;|$)
Run Code Online (Sandbox Code Playgroud)

其他一切都是一样的.

演示2.


小智 4

显然,我与 juharr (另一个答案)大约在同一时间开始编写我的反正则表达式方法。我想既然我已经写好了我就提交它。

    public static IEnumerable<string> SplitEmailsByDelimiter(string input, char delimiter)
    {
        var startIndex = 0;
        var delimiterIndex = 0;

        while (delimiterIndex >= 0)
        {
            delimiterIndex = input.IndexOf(';', startIndex);
            string substring = input;
            if (delimiterIndex > 0)
            {
                substring = input.Substring(0, delimiterIndex);
            }

            if (!substring.Contains("\"") || substring.IndexOf("\"") != substring.LastIndexOf("\""))
            {
                yield return substring;
                input = input.Substring(delimiterIndex + 1);
                startIndex = 0;
            }
            else
            {
                startIndex = delimiterIndex + 1;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后是下面的

            var input = "blah@blah.com;\"one@tw;,.'o\"@hotmail.com;\"some;thing\"@example.com;hello@world;asdasd@asd.co.uk;";
            foreach (var email in SplitEmailsByDelimiter(input, ';'))
            {
                Console.WriteLine(email);
            }
Run Code Online (Sandbox Code Playgroud)

会给出这个输出

blah@blah.com
"one@tw;,.'o"@hotmail.com
"some;thing"@example.com
hello@world
asdasd@asd.co.uk
Run Code Online (Sandbox Code Playgroud)