请仔细阅读问题,这不是关于验证电子邮件地址!
我正在尝试构建一个正则表达式(当前使用 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/