匹配电子邮件地址(如果它包含点)

时间:2015-05-06 12:15:28

标签: c# regex

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

我试过了

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

5 个答案:

答案 0 :(得分:7)

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

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

Try it out

答案 1 :(得分:3)

  

我只需要在@符号

之前选择包含点的那些

然后没有必要构建一个匹配有效电子邮件地址的正则表达式。你只需要一个正则表达式,看到UPDATE Children SET ChildName=ChildName WHERE ChildID IN (SELECT MIN(ChildID) AS m FROM Children GROUP BY ParentID) 符号前面有一个点:

@

(?<=[.][^@]*)@ 是一个积极的外观构造。它确保只有当点(?<=[.][^@]*)后面跟着零个或多个非@字符时才会匹配其后面的[.]符号。

答案 2 :(得分:2)

你可以使用lookahead ..为此目的..

(?=\.).+@

说明:

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

修改:要将电子邮件与上述条件匹配,您可以使用

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

请参阅DEMO

答案 3 :(得分:2)

LinQ可用于避免使用正则表达式并避免在“。”上调用IndexOf()两次:

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

答案 4 :(得分:2)

James' answer可能会给你最好的表现。但是,IndexOf方法不会处理带引号的字符串(即。"abc@.xtest.yz"@example.com,这是根据RCF 5322的有效地址)。为了支持这种情况,并且如果性能不是问题,您还可以使用以下内容,这对于LINQ查询的意图有点可读性和冗长:

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

构建MailAddress对象的开销非常明显,但这使得你很清楚你想要那些在地址的本地部分有一个点的地址。