繁体   English   中英

正则表达式-将电子邮件地址与例外匹配

[英]Regular Expression - Match Email Address with Exceptions

请仔细阅读问题,这与验证电子邮件地址无关!

我正在尝试构造一个正则表达式(当前在C#中),该正则表达式从文本中提取所有电子邮件地址,但有两个特定的例外。

我有:

  • user1@company.com
  • user2@company.com
  • user3@company.com
  • user1@private.com
  • user2@private.com

所有内容都在同一行的同一文本文件中,以空格字符分隔。

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

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

效果很好。 现在,我还有另一个要求:如果完整的电子邮件地址匹配“ user2@private.com”,则也将不匹配。 因此它应该匹配“ user2@company.com”,因此我不能使用:

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

因此,我在后面尝试了另外一个负面的看法:

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

这是行不通的,因为我猜似乎对匹配“ user2@private.co”很满意。 有什么方法可以实现我的目标? 我的头已经疼了...

我会使用其他代码,但是由于我使用的第三方软件仅给我正则表达式的选项,而只有单个正则表达式的选项,这就是我所拥有的全部...

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

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

参见regex演示

详细资料

  • (?<!\\S) -不以非空白char开头的位置
  • (?!user1@|user2@private\\.com(?!\\S)) -该位置不能跟随user1@user2@private.com不能跟随非空格字符
  • \\S+ -1+非空格
  • @ -文字@
  • \\S+ -1+非空格
  • \\. -一个点
  • [a-zA-Z]{2,}(?!\\S) -2个或更多ASCII字母,后跟非空格字符。

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

var s = @"Text user1@company.com here user2@company.com and user3@company.com here user1@private.com more user2@private.com";
var result = s.Split().Where(m => 
        Regex.IsMatch(m, @"^\S+@\S+\.\S+$") && m != "user2@private.com" && !m.StartsWith("user1@"));
foreach (var str in result)
    Console.WriteLine(str);
// => user2@company.com, user3@company.com

参见C#演示

您应该可以使用否定的前瞻。 如果您需要过滤掉明确的电子邮件,则以下解决方案应该可以使用。 但是请记住,它不是完全可扩展的。 您不希望在此处应用数千封电子邮件。

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

如果您怀疑将来可能会应用许多规则,那么您可能需要考虑一种更好的方法。 如果要过滤的电子邮件是显式的(不是模式),则可以在某处维护黑名单,并在提取/验证电子邮件地址模式后将其过滤掉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM