You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何编写正则表达式匹配「To: 」后全部邮箱并返回列表

问题原因

你写的正则里的后视断言(?<=To: )仅能匹配紧接在To: 后面的第一个邮箱,后续邮箱前面带有逗号、空格等分隔符,不满足「紧跟To: 」的匹配条件,因此只能拿到第一个结果。

调整方案

有两种常用实现方式,按需选择即可:

方案1:调整正则直接匹配(适配.NET正则特性)

.NET的Regex支持可变长度的后视断言,你可以把正则修改为:

var senderRgx = new Regex(@"(?<=To: .*?)\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.IgnoreCase);
// 调用Matches方法获取所有匹配结果
var matches = senderRgx.Matches(yourInputString);
foreach (Match match in matches)
{
    Console.WriteLine(match.Value);
}

修改点是把后视条件从(?<=To: )改成(?<=To: .*?),允许To: 和当前匹配的邮箱之间存在任意长度的字符,就能命中所有前缀是To:的行里的全部邮箱。

方案2:先截取再匹配(兼容性更强、性能更好)

如果需要兼容其他不支持可变后视的正则引擎,优先选这个方案:

  1. 先匹配提取To: 之后的所有内容
  2. 再用基础的邮箱正则对截取到的子串做全局匹配
    示例代码:
// 先匹配To:行
var toLineMatch = Regex.Match(yourInputString, @"^To: (.+)$", RegexOptions.Multiline);
if (toLineMatch.Success)
{
    var toContent = toLineMatch.Groups[1].Value;
    // 全局匹配邮箱
    var emailRgx = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.IgnoreCase);
    var emailMatches = emailRgx.Matches(toContent);
    foreach (Match emailMatch in emailMatches)
    {
        Console.WriteLine(emailMatch.Value);
    }
}
注意事项
  • 不管用哪种方案,都要调用Matches方法获取所有匹配结果,不要用只返回第一个匹配的Match方法
  • 加上RegexOptions.IgnoreCase可以兼容大小写混合的邮箱格式,符合邮箱地址的规范要求

内容的提问来源于stack exchange,提问作者Sara N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:06:02