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:先截取再匹配(兼容性更强、性能更好)
如果需要兼容其他不支持可变后视的正则引擎,优先选这个方案:
- 先匹配提取
To:之后的所有内容 - 再用基础的邮箱正则对截取到的子串做全局匹配
示例代码:
// 先匹配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
相关产品推荐
相关产品推荐

