我希望匹配在.
符号前至少包含一个@
(点)的任何电子邮件地址。电子邮件已经过验证,因此正则表达式只需要搜索.
。
我试过了
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
答案 0 :(得分:7)
你可以在没有正则表达式的情况下做到这一点
Func<string, bool> dotBeforeAt = delegate(string email)
{
var dotIndex = email.IndexOf(".");
return dotIndex > -1 && (dotIndex < email.IndexOf("@"));
};
...
emails.Where(dotBeforeAt).ToList();
答案 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
对象的开销非常明显,但这使得你很清楚你想要那些在地址的本地部分有一个点的地址。