Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式-将电子邮件地址与异常匹配_C#_Regex_Pattern Matching - Fatal编程技术网

C# 正则表达式-将电子邮件地址与异常匹配

C# 正则表达式-将电子邮件地址与异常匹配,c#,regex,pattern-matching,C#,Regex,Pattern Matching,请仔细阅读该问题,它不是关于验证电子邮件地址 我正试图构造一个正则表达式(目前使用C#),它从文本中提取所有电子邮件地址,但有两个特定的例外 我得到: user1@company.com user2@company.com user3@company.com user1@private.com user2@private.com 都在同一行的同一文本文件中,由空格字符分隔 起初,我试图匹配所有这些电子邮件地址,除了那些以“user1”开头的。我用过: [\S]*(? 这很好。现在我有另一个要

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

我正试图构造一个正则表达式(目前使用C#),它从文本中提取所有电子邮件地址,但有两个特定的例外

我得到:

  • user1@company.com
  • user2@company.com
  • user3@company.com
  • user1@private.com
  • user2@private.com
都在同一行的同一文本文件中,由空格字符分隔

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

[\S]*(?
这很好。现在我有另一个要求sais:如果完整的电子邮件地址匹配,也不匹配“user2@private.com“。所以它应该匹配”user2@company.com“,因此我不能使用:

[\S]*(?<!(user1|user2))@[\S]*\..[a-zA-Z.]{1,}
[\S]*(?
因此,我尝试了另一种消极的回顾:

([\S]*(?<!user1)@[\S]*\..[a-zA-Z.]{1,})(?<!user2@private\.com)
([\S]*(?
这不起作用,因为它似乎对匹配感到满意”user2@private.co“我想。有什么办法可以实现我想做的吗?我的头已经痛了


我会使用额外的代码,但因为我使用的是第三方软件,它只给我正则表达式的选项,并且只给我单个正则表达式的选项,这就是我所拥有的,…

你应该能够使用消极的前瞻。如果你有明确的电子邮件需要过滤,下面的解决方案应该可以使用.但请记住,它不是完全可扩展的。您不会希望在这里应用数千封电子邮件

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


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

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

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

请参阅。

可能对您有用。使用空格拆分,获取与
@“^\S+@\S+\.\S+$匹配的项目
并使用一点代码过滤掉不需要的匹配项。一个单一的正则表达式解决方案-,但看起来不太好。@WiktorStribiżew非常好,…你想添加这个作为答案吗?我需要一些时间来理解你做了什么,…但我看到它是有效的。@HimBromBeere:请再读一遍这篇文章,它不是你所做的重复发布。它不是关于验证常规电子邮件地址。它不是关于验证电子邮件,它是关于提取类似电子邮件的子字符串(有例外)。您的正则表达式将匹配'user1@company.com,但我需要它不匹配。它应排除“user1@”,但仅限于“user2@private.com“,但不是”user2@company.com"我已经更新了表达式,以反映正则表达式需要忽略任何以
user1
开头的地址,以及任何以
user2
开头但仍与
开头的地址匹配的地址user2@company.com
。请告诉我这是否合适。我稍微更改了一下,以便吴最后工作:(?)?
(?<!\S)(?!user1@|user2@private\.com(?!\S))\S+@\S+\.[a-zA-Z]{2,}(?!\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