首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >匹配电子邮件的正则表达式

匹配电子邮件的正则表达式
EN

Stack Overflow用户
提问于 2017-04-29 06:55:34
回答 3查看 8.2K关注 0票数 3

我需要一个正则表达式,匹配电子邮件地址,local@domain与以下要求:

本地部分可以包含A-z、0-9、点、下划线和短划线。

域名可以包含A-z、0-9、点和短划线。域需要至少包含一个点。

如何确保:域不能以点或破折号开头或结尾。以及域需要包含至少一个点?

这两件事确实让我在尝试解决它时遇到了问题。

我尝试过以下几种方法:

代码语言:javascript
复制
Regex.IsMatch(email, @"(?:[^.-])([\w.-])@([\w.-])(?:[.-]$)");
EN

回答 3

Stack Overflow用户

发布于 2017-04-29 08:00:24

正确答案是:

只验证@是否存在,域部分是否匹配几个简单的规则,本地部分是否为64个字符,全部是否为<= 254个字符。

是的,完全排除非法字符,好的。并确保使用最后一个@符号,而不是第一个。有关有效域名上的所有商品,请参阅RFC 1035。也许RFC 819能帮上忙。

如果你使用的是超文本标记语言,那么只需使用电子邮件输入<input type="email" autocomplete="off" autocorrect="off">,你就会得到大多数开箱即用的东西,而不需要你做任何工作。参见email input validation at MDN。但请注意,根据浏览器的不同,即使这样也可能会受到太多限制。请参阅this bug,其中浏览器的正确行为是在电子邮件地址中接受unicode (接受IDN标签),然后执行从U标签到A标签的转换,然后才执行验证。

如果您愿意,还可以检查是否可以在DNS中找到该域,但这是一个不必要且费力的步骤。

为什么我要用大字大喊大叫?因为是这样的。臭气熏天。许多网站完全错误地理解了这一点。

首先,请阅读以下内容:I Knew How To Validate An Email Address Until I Read The RFC

给你,跟我讲讲道理。

在给定的情况下,正如文章所说,有以下基本规则:

  • @符号,
  • 各个部分的最大长度,
  • 完全禁止的字符,
  • ,以及一个显而易见的事实,即电子邮件地址是否有效的唯一决定因素是该电子邮件地址的颁发者-域所有者,

<>F218

然后是,唯一确定电子邮件地址是否真的会到达任何人的方法是向该地址发送电子邮件,并查看此人是否收到该电子邮件地址,因为这是询问该电子邮件地址的颁发者是否存在与其关联的实际用户帐户的唯一方法。

想想邮寄吧。假设有人给了你一个有趣的地址,比方说,这个:

代码语言:javascript
复制
AAB!129 Thor Circle 1/2 atomized Pile$
Armelioborrigenduliamo, GRICKL, θ-niner *
18957382:90347342;21017900~19127734.6
THE MOON

既然您以前可能从未向月球发送过邮件,那么您确定要根据您熟悉的地区的标准来判断月球邮件地址吗?你怎么知道那不是一个有效的地址?如果那些人只是做得很奇怪呢?如果你是一家计划和你的客户做生意的公司--赚了一大笔钱--你为什么要关心他们的地址是否奇怪,只要地址有效就行了?

事实上,您无法验证另一个机构的地址这一事实已被美国的标准业务实践所证明:邮政地址擦除。这意味着,当有人向您提交一个邮寄地址时,您将向美国邮政服务发送一个API调用,询问这是否是一个有效地址,并进一步询问它的规范格式。这是因为只有邮局才能告诉你地址是否是有效的。即使这样,你也不知道你的信是否会到达任何人,除非你试着寄出一封!

那么,为什么你会如此武断地拒绝某人使用一个完全有效的电子邮件地址,因为他们的电子邮件提供商知道这个地址是有效的(类似于向另一个国家甚至另一个星球发送邮件),仅仅因为它有一些你不习惯的格式,或者你愚蠢地认为它是错误的?

如果你只是想避免由于打字错误而导致的错误电子邮件地址,你仍然可以这样做。向用户显示“嘿,你的地址看起来不太对劲。是否确实包含您选择的这些字符?!#$%^&*()"{}[]`~请记住,如果我们无法向您发送电子邮件,您将无法创建帐户。“然后人们得到警告,但如果他们真的想,他们仍然可以提交它。(好的,是的,排除完全禁止的字符。我列出的那些不一定是有效的。查一查。你应该查查这个。真的。你不应该相信某个随意的网民说的话。获得理解。)

去吧,甚至让它变得有点痛苦--让他们提交两次。或者选中复选框并再次提交。只是不要阻止他们使用他们想要的任何东西。

有时,我个人决定不使用不能接受本地部分(@之前)带有加号的电子邮件地址的网站或服务。如果我必须拥有帐户,我会咬紧牙关,有点生气,然后提交一个与我真正想使用的地址不同的地址。

除非你真的想减少你可以与之做生意的客户。那就去吧,太严格了.

好吧,在这一点上,你恨我

你觉得我反应过度了。你只想验证你的电子邮件地址!能有这么难吗?事实上,你只是打算忽略我,继续写一个可以完成这项工作的程序。这已经足够好了。

好吧,好吧。如果你不听从理智和理性,那就用here's some regex for you that does it 吧。(只是,我真的不知道它是否正确,但我敢打赌,它比在座的任何人在不到几天的工作时间里就能提出的任何东西都更接近正确。)

神奇的电子邮件-验证正则表达式

代码语言:javascript
复制
(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

当然,它已经被断行了。删除换行符。

票数 9
EN

Stack Overflow用户

发布于 2017-04-29 07:36:14

编辑

我认为这是可行的:

代码语言:javascript
复制
Regex regex = new Regex(@"^([\w\.\-]+)@((?!\.|\-)[\w\-]+)((\.(\w){2,3})+)$");

注意:域名不能有点和空格

但是,您可以尝试使用Mail Address Class,而不是使用正则表达式。这样,您就不必因为理解其他人的正则表达式而头破血流

代码语言:javascript
复制
public bool IsEmailValid(string address)
{
    try
    {
        MailAddress m = new MailAddress(address);
        return true;
    }
    catch (FormatException)
    {
       return false;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2017-04-29 09:10:21

您应该从http://www.regular-expressions.info等来源学习正则表达式-到目前为止,尝试显示了许多缺失的知识,并且所述问题非常复杂(甚至忽略了自定义正则表达式几乎肯定是错误的方法,尽管它可能是一个有用的预过滤器)。

为什么这个正则表达式不起作用- @"(?:[^.-])([\w.-])@([\w.-])(?:[.-]$)");

我将通过将正则表达式分解为英语来解释(这通常是一个很好的正则表达式技术):

首先,这里的所有括号都没有任何功能,所以我忽略了它们(参见教程了解它们的含义)

本地

  • [^.-] -1字符,不是点或dash
  • [\w.-] -1字母数字字符,也不是点或破折号

因此,的定义是任何以带有上述约束的2个字符字符串结尾的字符串local。

@ -文字,字符'@‘

域名

  • [\w.-] -1字符,可以是字母数字、点或dash
  • [.-] -1字符,可以是点,也可以是字符串的dash
  • $结尾。

因此,domain的定义是一个具有上述约束的2个字符的字符串。

这显然与给定的问题相去甚远。

什么是满足给定约束的正则表达式?

正则表达式基本上是按从左到右的顺序进行计算的。在一组连续的描述中表达您的约束,然后将其转换为正则表达式结构。我将针对给定的约束执行此操作(我认为这些约束并不完整)。在每一行之间插入一个“后跟”。

字符串开头- ^ -正则表达式表示字符串开头的方式

local - [\w._-]* -任意数量的(字母数字、点、破折号)。

@- @ -文字字符

域名

关键要求是至少1个点。这个点将显式地出现在正则表达式中,因此可以将域想象为{preDot}{点}{postDot}。为简单起见,将{点}定义为.first实例。

  • \w -单个字母数字字符-这是不以点或短划线开头的字符- requirement
  • [\w-]* -任意数量的字母数字字符或dash
  • \. -单个(第一个)点字符-这是必须存在的特殊字符dot
  • (\w*[\.-])* -任意数量的(任意数量的字母数字字符后跟一点或dash)
  • [\w-]+ -1或更多字母数字或短划线字符-这是must not end in dot requirement

(要求不以点结尾)

end of string - $ -正则表达式表示字符串结尾的方式

下面是相应的代码:

代码语言:javascript
复制
var literal = @"\w*";

var preDot = @"\w[\w-]*";
var dot = @"\.";
var postDot = @"(\w*[\.-])*[\w-]+";
var domain = $"{preDot}{dot}{postDot}";

var email = $"^{literal}@{domain}$";

仅供参考-正则表达式最终是^\w*@\w[\w-]*\.(\w*[\.-])*[\w-]+$,但这在很大程度上是无关紧要的,试图将其理解/维护/更改为单个字符串将是可怕的,而故障是可跟踪的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43689934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档