如果电子邮件地址包含点,请匹配该地址



我想匹配任何电子邮件地址,该地址在@符号之前至少包含一个.(点)。电子邮件已经过验证,因此正则表达式只需要搜索.即可。

我试过了

Regex emailMatcher = new Regex(@"^[a-zA-Z.']{1,}.[a-zA-Z.']{1,}@example.com$");

但我知道电子邮件可以包含比a-zA-Z.'更多的字符,因此这不会涵盖所有情况。

关于如何做到这一点的任何想法?

谢谢

编辑:我不是在尝试验证电子邮件,我已经验证了电子邮件,我只需要选择电子邮件,在@签名之前包含.

将通过的示例:

first.last@example.com
first.middle.last@example.com

应该通过但使用我当前的正则表达式不会通过的示例

first.last(comment)@example.com

你可以在没有正则表达式的情况下做到这一点

Func<string, bool> dotBeforeAt = delegate(string email) 
{ 
var dotIndex = email.IndexOf(".");
return dotIndex > -1 && (dotIndex < email.IndexOf("@"));
};
...
emails.Where(dotBeforeAt).ToList();

试试看

我只需要选择那些在@符号之前包含点的

那么构建与有效电子邮件地址匹配的正则表达式就没有意义了。您所需要的只是一个正则表达式,它看到@符号前面有一个点:

(?<=[.][^@]*)@

(?<=[.][^@]*)是一个积极的背后看结构。它确保仅当前面有一个点[.]后跟零个或多个非@字符时,才匹配它后面的@符号。

您可以使用 lookahead.. 为此。

(?=.).+@

解释:

  • 期待一个点,后跟任何字符,后跟@

编辑:要将电子邮件与上述条件相匹配,您可以使用

.+(?=..+@).+

查看演示

LinQ 既可以用来避免正则表达式,又可以避免在 "." 上调用IndexOf()两次:

var dottyEmails = (from email in emails 
let dotIndex = email.IndexOf(".")
let atIndex = email.IndexOf("@")
where dotIndex >= 0 && dotIndex < atIndex
select email).ToList();

詹姆斯的回答可能会给你最好的表现。但是,IndexOf方法不会处理带引号的字符串(即。"abc@.xtest.yz"@example.com,根据 RCF 5322,这是一个有效的地址)。为了支持这种情况,如果性能不是问题,您还可以使用以下内容,这对于 LINQ 查询的意图更具可读性和详细程度:

emails.Select(m => new MailAddress(m)).Where(m => m.User.Contains('.')).ToList();

构建MailAddress对象的开销非常明显,但这非常清楚地表明您希望那些地址的本地部分有一个点的地址。

最新更新