c# - 正则表达式 - 将电子邮件地址与异常(exception)情况相匹配

标签 c# regex pattern-matching

请仔细阅读问题,这不是关于验证电子邮件地址!

我正在尝试构建一个正则表达式(当前使用 C#)从文本中提取所有电子邮件地址,但有两个特定的异常(exception)。

我得到了:

全部位于同一文本文件的同一行中,以空格字符分隔。

起初,我尝试匹配所有这些电子邮件地址,除了以“user1”开头的电子邮件地址。我用过:

[\S]*(?<!user1)@[\S]*\..[a-zA-Z.]{1,}

效果很好。现在我有另一个要求:如果完整的电子邮件地址与“[email protected]”匹配,则也不匹配。所以它应该匹配“[email protected] ”,因此我不能使用:

[\S]*(?<!(user1|user2))@[\S]*\..[a-zA-Z.]{1,}

因此我尝试了额外的负面回顾:

([\S]*(?<!user1)@[\S]*\..[a-zA-Z.]{1,})(?<!user2@private\.com)

这不起作用,因为我猜它似乎对匹配“[email protected] ”感到满意。有什么办法可以实现我想要做的事情吗?我的头已经很痛了,...

我会使用额外的代码,但由于我使用的是第三方软件,它只给我提供正则表达式的选项,并且只提供单个正则表达式的选项,这就是我所拥有的一切,...

最佳答案

一个看起来不太好的正则表达式解决方案是

(?<!\S)(?!user1@|user2@private\.com(?!\S))\S+@\S+\.[a-zA-Z]{2,}(?!\S)

参见 regex demo

详细信息:

  • (?<!\S) - 前面没有非空白字符的位置
  • (?!user1@|user2@private\.com(?!\S)) - 该位置后面不能跟 user1@<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2a5f594f58186a5a58435c4b5e4f04494547" rel="noreferrer noopener nofollow">[email protected]</a> 后面不能跟非空白字符
  • \S+ - 1+ 非空白
  • @ - 文字 @
  • \S+ - 1+ 非空白
  • \. - 一个点
  • [a-zA-Z]{2,}(?!\S) - 2 个或更多 ASCII 字母后面不跟有非空白字符。

一种更易读的方法是用空格分割,获取与 @"^\S+@\S+\.\S+$" 匹配的项目,并使用一些代码来过滤掉不需要的匹配:

var s = @"Text <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5c292f392e6d1c3f33312c3d3225723f3331" rel="noreferrer noopener nofollow">[email protected]</a> here <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d1a4a2b4a3e391b2bebca1b0bfa8ffb2bebc" rel="noreferrer noopener nofollow">[email protected]</a> and <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cbbeb8aeb9f88ba8a4a6bbaaa5b2e5a8a4a6" rel="noreferrer noopener nofollow">[email protected]</a> here <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7207011700433202001b041306175c111d1f" rel="noreferrer noopener nofollow">[email protected]</a> more <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f481879186c6b484869d82958091da979b99" rel="noreferrer noopener nofollow">[email protected]</a>";
var result = s.Split().Where(m => 
        Regex.IsMatch(m, @"^\S+@\S+\.\S+$") && m != "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2451574156166454564d524550410a474b49" rel="noreferrer noopener nofollow">[email protected]</a>" && !m.StartsWith("user1@"));
foreach (var str in result)
    Console.WriteLine(str);
// => <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c5b0b6a0b7f785a6aaa8b5a4abbceba6aaa8" rel="noreferrer noopener nofollow">[email protected]</a>, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f88d8b9d8acbb89b979588999681d69b9795" rel="noreferrer noopener nofollow">[email protected]</a>

参见 C# demo

关于c# - 正则表达式 - 将电子邮件地址与异常(exception)情况相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43629770/

相关文章:

scala - 类型模式匹配为什么变量是必须的

c# - 什么 RegEx 字符串会找到字符串中最后(最右边)的一组数字?

python - 在 Python 中使用正则表达式作为模板

java - 如何匹配模式正则表达式中 token 的最后一个实例?

regex - SED:将现有模式插入同一行的其他几个地方

javascript - 从文本中获取所有单词,包括附加到这些单词的任何特殊字符

scala - Scala 中不区分大小写的模式匹配

c# - 在wpf中动态添加列到DataGrid

c# - 获取 SortedDictionary 中的最后一个元素

c# - 默认构造函数在不需要时不必要地初始化依赖项