c# - 如何从 C# 中的文本中提取连续的电子邮件地址

标签 c# regex email

我有以下三个字符串示例:

string1 = "abcd@efg.com 这只是一些文本。这些只是一些数字 123456 xyz@xyz.com asdasd asdad"

string2 = "abcd@efg.com mnop@qrs.com 这只是一些文本。这些只是一些数字 123456 xyz@xyz.com asdasd asd"

string3 = "abcd@efg.com mnop@qrs.com uvw@xyz.com 这只是一些文本。这些只是一些数字 123456 xyz@xyz.com asdad"

最终输出应该是一个列表,其中包含在字符串开头连续出现的所有电子邮件。

string1 的输出 - 一个电子邮件地址

string3 的输出 - 三个电子邮件地址

地址“xyz@xyz.com”应该被忽略,因为它出现在其他文本之间。 有什么解决办法吗? 现有方法返回所有地址。

    private List<string> ExtractEmails(string strStringGoesHere)
    {
        List<string> lstExtractedEmails = new List<string>();
        Regex reg = new Regex(@"[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}", RegexOptions.IgnoreCase);
        Match match;
        for (match = reg.Match(strStringGoesHere); match.Success; match = match.NextMatch())
        {
            if (!(lstExtractedEmails.Contains(match.Value)))
            {
                lstExtractedEmails.Add(match.Value);
            }
        }
        return lstExtractedEmails;
    }

最佳答案

您可以使用 \G anchor ,它只在字符串的开头匹配,然后在每次成功匹配的末尾匹配:

@"(?i)\G\s*([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})"

参见 this demo

详情

  • (?i) - 内联大小写不敏感标志
  • \G - 仅匹配字符串开头和每次成功匹配结尾的 anchor
  • \s* - 0+ 个空格
  • ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}) - 第 1 组匹配像 substring 这样的电子邮件(有 other patterns that you may use here ,但一般来说,它类似于 \S+@\S+\.\S+)。

C# demo :

var strs = new List<string> {"abcd@efg.com this is just some text. these are just some numbers 123456 xyz@xyz.com asdasd asdad",
    "abcd@efg.com mnop@qrs.com This is just some text. these are just some numbers 123456 xyz@xyz.com asdasd asd",
    "abcd@efg.com mnop@qrs.com uvw@xyz.com This is just some text. these are just some numbers 123456 xyz@xyz.com asdad" };
foreach (var s in strs) 
{
    var results = Regex.Matches(s, @"(?i)\G\s*([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})")
        .Cast<Match>()
        .Select(x => x.Groups[1].Value);
    Console.WriteLine(string.Join(", ", results));
}

结果:

abcd@efg.com
abcd@efg.com, mnop@qrs.com
abcd@efg.com, mnop@qrs.com, uvw@xyz.com

关于c# - 如何从 C# 中的文本中提取连续的电子邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48741403/

相关文章:

java - JSP 联系表 - 将其发送到 Gmail

C#:带有以 Child 类型作为参数的方法的继承类:调用了错误的方法

c# - Parallel For 不会导致静态构造函数中的死锁?

c# - 获取 GridView 中每一行的 dataKey 值

c# - 是否可以检索Word中所有可用的图表模板

javascript - 我们如何使用以正则表达式开头的字符串 (/^myString/g)

发生多个匹配时的java正则表达式首选项

regex - NotePad++ regex 删除带有空格和某些字母的单词

带有德语字母的 PHP 邮件主题

linux - “猫文件”标准输出不同于 'cat file > textfile'