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

3
我有以下三个字符串示例:
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”
最终输出应该是一个列表,其中包含连续出现在字符串开头的所有电子邮件。
对于字符串1的输出-一个电子邮件地址
对于字符串3的输出-三个电子邮件地址
地址“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;
    }

这个怎么样?(https://regex101.com/r/vcUbCV/2) - Mohammad Javad Noori
谢谢 MJN,但对我没用。 - DevSa
1个回答

6

你可以使用\G锚点,它只匹配在字符串开头以及每次成功匹配的末尾:

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

请看这个演示细节:
  • (?i) - 行内不区分大小写标志。
  • \G - 锚定,仅在字符串开头和每个成功的匹配结尾处匹配。
  • \s* - 0个或多个空格。
  • ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}) - 第一组匹配类似电子邮件的子字符串(有其他模式可用于此处,但通常是\S+@\S+\.\S+)。
C#演示
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

你可能只想为每个匹配修剪空格。 - andnik
@AndriiNikolaienko 不需要,必要的数据在第一组。 - Wiktor Stribiżew
在regexStorm链接中,您使用了(\G|^)。为什么这里不仅使用\G就可以了呢? - Gurmanjot Singh
2
@Gurman 由于这是一个带有多行字符串的演示,我必须添加 ^ 作为替代,因为 \G 只能匹配整个字符串的开头,RegexOptions.Multiline 选项不会改变其行为。在实际代码中,\G 就足够了。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接