【发布时间】:2017-04-26 09:10:16
【问题描述】:
请仔细阅读问题,这不是关于验证电子邮件地址的问题!
我正在尝试构建一个正则表达式(目前在 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”感到满意。有什么办法可以实现我想要做的事情吗?我的头已经很痛了,...
我会使用额外的代码,但由于我使用的是第三方软件,它只给了我正则表达式的选项,而且只有一个正则表达式的选项,这就是我所拥有的,...
【问题讨论】:
-
也许this approach 对你有用。用空格分割,获取匹配
@"^\S+@\S+\.\S+$"的项目并使用一些代码过滤掉不需要的匹配项。 -
单个正则表达式解决方案 -
(?<!\S)(?!user1@|user2@private\.com(?!\S))\S+@\S+\.[a-zA-Z]{2,}(?!\S),但看起来不太好。 -
@WiktorStribiżew 非常好,...您想将其添加为答案吗?不过,我将需要一些时间来了解您所做的事情,...但我认为它有效。
-
@HimBromBeere:请再次阅读帖子,它与您发布的内容不重复。这与验证常规电子邮件地址无关。
-
这不是关于验证电子邮件,而是关于提取类似电子邮件的子字符串,但有例外。
标签: c# regex pattern-matching