如何在 JavaScript 中验证电子邮件地址?

How can I validate an email address in JavaScript?

提问人: 提问时间:9/6/2008 最后编辑:29 revs, 19 users 25%pix0r 更新时间:9/1/2023 访问量:4591368

问:

这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或交互。

我想在将用户输入发送到服务器或尝试向其发送电子邮件之前检查用户输入是否是 JavaScript 中的电子邮件地址,以防止最基本的错误输入。我怎样才能做到这一点?

javascript html 正则表达式 电子邮件验证

评论

23赞 David Mårtensson 5/3/2021
@Alex 我添加此评论的原因是,已接受的答案中建议的正则表达式将不允许现有的实时电子邮件地址,这对客户来说是一个糟糕的开始,真正的大问题是,即使该地址被接受,它仍然没有说它是否有效。可靠地验证所提供的电子邮件是否为有效电子邮件的唯一方法是发送带有验证链接的邮件。因此,如果您的用例不要求您验证电子邮件,只需对 @ 进行最小测试,否则使用验证电子邮件。正则表达式只会提供糟糕的用户体验。
0赞 mikael1000 6/3/2021
@David Mårtensson,我在你的想法上加了一个+。但是,我确实认为验证电子邮件链接也可能是糟糕的用户体验。一个会让你失去客户的人。
7赞 David Mårtensson 6/4/2021
@mikael1000当然,但是当您不知道它是否是有效的电子邮件时,正则表达式验证的目的是什么。如果您不想使用验证链接干扰客户,只需在<某物>处执行最简单的验证<某事>,然后就此结束。它将确保客户至少添加了一些可能是电子邮件的东西,在您进行实际验证之前,这主要是浪费代码。您可以通过 dns 查找来检查该域是否存在。
2赞 Peter Mortensen 2/17/2022
非常相似:如何使用正则表达式验证电子邮件地址?
3赞 Watts Epherson 8/23/2022
我不得不承认,我不明白为什么当你无法预测用户是否使用有效字符制作了基本类型时,会进行一些验证。只需检查 @,开始时至少一个点就足够了。

答:

96赞 4 revs, 3 users 54%Ben Scheirman #1

JavaScript 可以匹配正则表达式:

emailAddress.match( / some_regex /);

下面是电子邮件的 RFC22 正则表达式:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

评论

3赞 Ry- 3/10/2014
@Kato:它使用了一些不兼容的扩展,包括停止回溯和避免提供冗长的.(?>(?<angle><)…(?(angle)>)|
0赞 iPzard 11/8/2020
该方法返回一个数组,返回布尔值的方法更适合这种情况。matchtest
6531赞 31 revs, 29 users 20%rnevius #2

使用正则表达式可能是在 JavaScript 中验证电子邮件地址的最佳方式。查看从 Chromium 获取的一堆 JSFiddle 测试

const validateEmail = (email) => {
  return String(email)
    .toLowerCase()
    .match(
      /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    );
};

以下是接受 unicode 的正则表达式的示例。

const re =
  /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

请记住,不应仅依赖 JavaScript 验证,因为客户端可以轻松禁用 JavaScript。此外,在服务器端进行验证也很重要。

以下代码片段是 JavaScript 在客户端验证电子邮件地址的示例。

const validateEmail = (email) => {
  return email.match(
    /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  );
};

const validate = () => {
  const $result = $('#result');
  const email = $('#email').val();
  $result.text('');

  if(validateEmail(email)){
    $result.text(email + ' is valid.');
    $result.css('color', 'green');
  } else{
    $result.text(email + ' is invalid.');
    $result.css('color', 'red');
  }
  return false;
}

$('#email').on('input', validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<label for="email">Enter email address</label>
<input id="email" type="email">

<p id="result"></p>

评论

716赞 Randal Schwartz 9/8/2010
此正则表达式消除了有效的、正在使用的电子邮件。请勿使用。谷歌搜索“RFC822”或“RFC2822”以获得正确的正则表达式。
73赞 Vroo 10/26/2012
这甚至不接受 RFC 822 中的示例。一些简单的情况与 a\@[email protected] 不匹配,a(b)@c.com。有关详细信息,请参阅 RFC。这是一个不会拒绝任何有效地址 [^@]+@[^@]+\ 的正则表达式。[^@]+ 并防止常见错误。
232赞 Kevin Fegan 2/1/2014
您无法验证电子邮件地址、句点。唯一可以验证电子邮件地址的人是电子邮件地址的提供者。例如,此答案显示这些电子邮件地址都有效,但 Gmail 绝不允许使用这些电子邮件地址中的任何一个。为此,您应该接受电子邮件地址并向该电子邮件地址发送电子邮件,并附上用户必须访问的代码/链接以确认有效性。%[email protected], "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, [email protected], [email protected] , [email protected]
19赞 undefined 7/17/2021
@KevinFegan让我们现实一点:您不会使用 JavaScript 来确认电子邮件是否真实。我认为当用户注册时,这种验证是完全合理的。您可能不想费心将验证电子邮件发送到不可能存在的地址。有些可能还具有出站电子邮件限制,因此值得将电子邮件发送到 或任何其他有趣的用户输入。email@localhosti don't have an email
1赞 Code Cooker 11/5/2021
这是无效的,您的代码无法验证,它说有效的电子邮件。sean.o'[email protected]
524赞 5 revs, 5 users 44%Jaymon #3

哇,这里有很多复杂性。如果你只想捕捉最明显的语法错误,我会做这样的事情:

^\S+@\S+$

它通常会捕获用户犯的最明显的错误,并确保表单大部分是正确的,这就是 JavaScript 验证的全部内容。

编辑: 我们还可以使用以下命令检查电子邮件中的“.”。

/^\S+@\S+\.\S+$/

评论

117赞 kommradHomer 7/19/2012
+1 因为发送电子邮件并查看会发生什么是验证电子邮件地址的唯一真正可靠的方法,除了简单的正则表达式匹配之外,无需做更多的事情。
4赞 Mohit Atray 7/9/2021
但它不会接受“Mohit Atray”@gmail.com 因为它包含空格字符。也许我们应该只使用 /^\S.*@\S+$/ 正则表达式。
1赞 Randal Schwartz 6/22/2022
这仍然无效。局部部分允许使用空格,只要它们被正确转义(用双引号引起)。
0赞 Timo 8/23/2022
@RandalSchwartz你认为你关于@之前的空格的评论已经是莫希特写的了。
0赞 Avatar 8/30/2023
如何添加以确保句点后的字符串长度在 2 到 6 个字符之间?{2,6}
375赞 Paolo Bergantino #4

当你决定使用正则表达式来验证电子邮件时,你必须明白一些事情:这可能不是一个好主意。一旦你接受了这一点,有许多实现可以让你成功一半,这篇文章很好地总结了它们。

然而,简而言之,要绝对、肯定地确定用户输入的内容实际上是一封电子邮件,唯一的方法是实际发送电子邮件并查看会发生什么。除此之外,这一切都只是猜测。

评论

77赞 Stephen P 3/7/2013
@kommradHomer -- “正则表达式无效”地址几乎总是有效的,因为无论您使用什么正则表达式来验证电子邮件地址,几乎肯定是错误的,并且会排除有效的电子邮件地址。电子邮件地址是,实际上任何内容(包括 )在name_part中都是有效的;该地址是合法的,但必须转义为 .一旦电子邮件到达域,例如“example.com”,该域就可以“本地”路由邮件,因此可以存在“奇怪”的用户名和主机名。name_part@domain_part@foo@[email protected]foo\@bar@machine....
79赞 Adam McKee #5

这是从 http://codesnippets.joyent.com/posts/show/1917 偷来

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}
25赞 2 revs, 2 users 84%jacobangel #6

很难让电子邮件验证器100%正确。唯一正确的方法是向该帐户发送测试电子邮件。也就是说,有一些基本的检查可以帮助确保你得到一些合理的东西。

一些需要改进的地方:

而不是 new ,试着这样写出来:RegExpregexp

if (reg.test(/@/))

其次,检查以确保符号后面有一个句点,并确保 s 和句点之间有字符。@@

903赞 9 revs, 5 users 64%Esteban Küber #7

为了完整起见,这里有另一个符合 RFC 2822 的正则表达式

官方标准称为 RFC 2822。它描述了有效电子邮件地址必须遵循的语法。你可以(但你不应该 - 继续阅读)用这个正则表达式实现它:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

(...)如果我们省略使用双引号和方括号的语法,我们将获得更实用的 RFC 2822 实现。它仍然会匹配今天实际使用的所有电子邮件地址的 99.99%。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

您可以进行的进一步更改是允许任何两个字母的国家/地区代码顶级域,并且仅允许特定的通用顶级域。此正则表达式过滤虚拟电子邮件地址,例如 [email protected]。在添加新的顶级域时,您需要对其进行更新

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

因此,即使遵循官方标准,仍需要做出权衡。不要盲目地从在线库或论坛中复制正则表达式。始终使用您自己的数据和您自己的应用程序对其进行测试。

强调我的

评论

111赞 Piskvor left the building 6/13/2012
注意:“今天实际使用”在200x编写代码时可能是有效的。该代码可能会在该特定年份之后继续使用。(如果我每“呃,除了那些特定的TLD”,没有人会使用4+字母的TLD,我就可以垄断世界铜和镍市场;))
5赞 toastrackengima 10/6/2021
请注意,这不会捕获一些有效的电子邮件地址,例如以下表情符号: mailoji.com
8赞 Christian Vincenzo Traina 6/6/2022
@Toastrackenigma如果有人使用表情符号电子邮件,则不值得订阅我的网站。就这么简单。
0赞 lnl 4/23/2023
@ChristianVincenzoTraina最后一个拒绝了我在 .rocks 域名上的电子邮件地址。如果这阻止了我访问您的时事通讯,那么我没有将 Ignorant Daily 发送到我的收件箱可能对我有好处,但阻止我使用此域的服务列表包括:全国公共交通系统、航空公司、医疗服务......
1赞 Christian Vincenzo Traina 4/24/2023
@lnl最后一个是无法维护的。自 2009 年以来,顶级域名的数量呈爆炸式增长
12赞 Eric Schoonover #8

这里有一个关于使用正则表达式验证电子邮件地址的非常好的讨论;“比较电子邮件地址验证正则表达式"

以下是当前最热门的表达式,即与 JavaScript 兼容,仅供参考:

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i

评论

0赞 Slbox 9/4/2021
现在已经非常过时了。
12赞 Félix Saparelli #9

显然,就是这样:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

取自10年10月1日的 http://fightingforalostcause.net/misc/2006/compare-email-regex.php。

但是,当然,这忽略了国际化。

86赞 5 revs, 4 users 82%Miloš Rašić #10

根据 RFC 正确验证电子邮件地址不是单行正则表达式可以实现的。我在 PHP 中找到的最佳解决方案的一篇文章是什么是有效的电子邮件地址?。显然,它已经被移植到了 Java 中。我认为该函数太复杂了,无法在 JavaScript 中移植和使用。JavaScript/node.js端口:https://www.npmjs.com/package/email-addresses

一个好的做法是在客户端上验证数据,但要仔细检查服务器上的验证。考虑到这一点,您可以简单地检查字符串是否看起来像客户端上的有效电子邮件地址,并在服务器上执行严格检查。

这是我用来检查字符串是否看起来像有效邮件地址的 JavaScript 函数:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

解释:

  • lastAtPos < lastDotPos:Last 应该在 last 之前,因为不能是服务器名称的一部分(据我所知)。@.@

  • lastAtPos > 0:在最后一个之前应该有一些东西(电子邮件用户名)。@

  • str.indexOf('@@') == -1:地址中不应有。即使显示为电子邮件用户名中的最后一个字符,它也必须被引用,因此它将位于该字符和地址中的最后一个字符之间。@@@"@@

  • lastDotPos > 2:最后一个点之前至少应有三个字符,例如 。[email protected]

  • (str.length - lastDotPos) > 2:最后一个点之后应该有足够的字符来形成一个双字符域。我不确定括号是否必要。

324赞 9 revs, 7 users 31%Anoop #11

HTML5 本身具有电子邮件验证功能。如果您的浏览器支持 HTML5,则可以使用以下代码。

<form>
  <label>Email Address
    <input type="email" placeholder="[email protected]" required>
  </label>
  <input type="submit">
</form>

jsFiddle 链接

HTML5 规范

有效的电子邮件地址是与以下 ABNF 的生成相匹配的字符串,其字符集为 Unicode。email

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

此要求是故意违反 RFC 5322 的,RFC 5322 定义了电子邮件地址的语法,该语法同时过于严格(在“@”字符之前)、过于模糊(在“@”字符之后)和过于宽松(允许注释、空格字符和以大多数用户不熟悉的方式引用字符串)在这里没有实际用处。

以下兼容 JavaScript 和 Perl 的正则表达式是上述定义的实现。

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

评论

54赞 Jason 11/12/2011
这很好,但问题在于它必须在标签内并由输入提交,这不是每个人都能做到的。此外,您无法真正设置错误消息的样式。formsubmit
0赞 Thomas Champion 10/22/2021
起初我发现这个答案很有用,但我尝试使用一些无效的电子邮件地址,正则表达式说有有效的......例如:(缺少扩展名)、(多个@)等(参见 en.wikipedia.org/wiki/Email_address#Examples)。我在这里找到了一个不错的正则表达式:emailregex.combar@domainA@b@[email protected]
2赞 KNP 12/7/2021
@ThomasChampion 多个“@”有效。不过,第一点是有效的。
2赞 Thomas Champion 12/8/2021
@KNP 仅当额外的“@”出现在用户名部分并用双引号括起来时,Multiple 才有效。自 2013 年以来,第二点(缺少扩展名)似乎不再有效(icann.org/en/announcements/details/...),但是的,这取决于,我想有人可以考虑扩展是可选的。最后,我从 joi: joi.dev/module/address/api/?v=4.1.0#emailisvalidemail-options 中选择模块来验证我的应用程序中的电子邮件地址。@address
33赞 5 revs, 2 users 79%Zo72 #12

不应使用正则表达式来验证输入字符串以检查它是否为电子邮件。它太复杂了,无法涵盖所有情况。

现在,由于您只能涵盖 90% 的情况,因此可以这样写:

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

你可以细化它。例如,“aaa@”是有效的。但总的来说,你明白了要点。不要得意忘形......一个简单的 90% 解决方案比 100% 不起作用的解决方案要好。

世界需要更简单的代码......

评论

27赞 cazlab 1/7/2012
这允许输入如此多的无效电子邮件地址,这是无用的建议。
1322赞 10 revs, 10 users 33%C. Lee #13

我稍微修改了 Jaymon 的答案,供那些想要以以下形式进行真正简单验证的人使用:

[email protected]

正则表达式:

/^\S+@\S+\.\S+$/

要防止匹配多个 @ 符号,请执行以下操作:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

上面的正则表达式匹配整个字符串,如果要匹配字符串中的任何位置,请删除前导和尾随。下面的示例与字符串中的任意位置匹配。^$

如果你确实想匹配整个吊环,你可能想先匹配字符串。trim()

JavaScript 函数示例:

function validateEmail(email) {
  var re = /\S+@\S+\.\S+/;
  return re.test(email);
}
    
console.log(validateEmail('my email is [email protected]')); // true
    
console.log(validateEmail('my email is anystring@anystring .any')); // false

评论

121赞 user83358 7/31/2012
你可以实现 20 倍长的东西,这可能会给一些用户带来问题,并且将来可能无效,或者你可以抓住 ImmortalFirefly 的版本,以确保他们至少付出努力让它看起来真实。根据您的应用程序,可能更有可能遇到有人会生气,因为您不接受他们的非常规电子邮件,而不是通过输入实际上不存在的电子邮件地址来引起问题的人(他们无论如何都可以通过输入 100% 有效的RFC2822电子邮件地址来做到这一点,但使用未注册的用户名或域)。点赞!
132赞 OregonTrail 8/9/2012
@ImmortalFirefly,您提供的正则表达式实际上将匹配。尝试将行粘贴到 JavaScript 控制台中。我相信您的意图是仅匹配整个文本,这需要文本“^”的开头和文本“$”的结尾运算符。我正在使用的那个是name@[email protected]/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@[email protected]')
8赞 ruohola 10/6/2021
电子邮件可以包含多个符号(作为注释),电子邮件也不必包含句点。@
4赞 ruohola 2/10/2022
@JoseG。是的。例如 是某人的有效域,因此他们可以使用例如 作为他们的电子邮件。http://aia@ai
1赞 Jelaby 8/21/2022
@Timo 的意思是“既不是空格字符,也不是”。 表示 x、y 或 z 中的任何一个,并表示除 x、y 或 z 以外的任何一个字符。 表示“任何空格字符”。 表示“任何非空格的字符”。[^\s@]@[xyz][^xyz]\s\S
15赞 4 revs, 4 users 56%steve #14

squirtle 相比,这是一个复杂的解决方案,但它在正确验证电子邮件方面做得很好:

function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

像这样使用:

if (isEmail('yourem[email protected]')){ console.log('This is email is valid'); }
6赞 2 revs, 2 users 71%Darren Cato #15

Sectrean 的解决方案效果很好,但它让我失望了。所以我添加了一些转义:

function validateEmail(email){ 
     var re = /^(([^<>()[]\\.,;:\s@\"]+(\.[^<>()[]\\.,;:\s@\"]+)*)|(\".+\"))@(([[0-9]{1,3}\‌​.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 
     return re.test(email); 
}

评论

0赞 Ikrom 10/22/2013
validateEmail(“[email protected]”) 和 validateEmail(“[email protected]”) 都返回值false
74赞 10 revs, 4 users 71%Ryan Taylor #16

这样做:

^([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)$

它基于 RFC 2822

https://regex101.com/r/857lzc/1 下进行测试

通常,在数据库中存储电子邮件地址时,我会将它们设置为小写,并且实际上,正则表达式通常可以标记为不区分大小写。在这些情况下,这略短:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

下面是它在 JavaScript 中使用的示例(末尾带有不区分大小写的标志)。i

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('[email protected]') );

注意
从技术上讲,某些电子邮件可以在符号前的部分中包含引号,并在引号内包含转义字符(因此您的电子邮件用户可能会令人讨厌,并且只要它用引号写成,就包含诸如 和 之类的内容)。从来没有人这样做过!它已经过时了。但是,它包含在真正的 RFC 2822 标准中,此处省略。
@@"..."

注2: 电子邮件的开头(在 @ 符号之前)可以区分大小写(通过规范)。但是,任何使用区分大小写的电子邮件的人都可能习惯于遇到问题,并且在实践中,不区分大小写是一个安全的假设。详细信息:电子邮件地址区分大小写吗?

更多的信息: http://www.regular-expressions.info/email.html

评论

1赞 Gautam Parmar 8/6/2021
[email protected] - 显示是有效的,不应该
3赞 TylerH 5/4/2022
@GautamParmar gmail 和其他人会忽略符号;发送到 Gauta[email protected] 的邮件最终会进入 [email protected] 的电子邮件收件箱。
167赞 6 revs, 4 users 66%Boldewyn #17

在现代浏览器中,您可以使用纯 JavaScript 和 DOM 在 @Sushil 的答案之上进行构建:

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

我在小提琴 http://jsfiddle.net/boldewyn/2b6d5/ 中整理了一个例子。结合功能检测和 Squirtle's Answer 的基本验证,它使您摆脱了正则表达式大屠杀,并且不会在旧浏览器上感到厌烦。

评论

8赞 Matt 7/16/2021
从长远来看,这应该是公认的答案。让拥有正则表达式专家的浏览器供应商为电子邮件地址维护大量复杂的正则表达式。构建用于收集电子邮件的表单的普通前端开发人员通常没有时间掌握冗长的正则表达式。是的,您必须依赖供应商提供的正则表达式,但是如果您需要更复杂的东西,请在服务器上执行此操作,或者发送实际的电子邮件并检查响应
0赞 NurShomik 1/1/2022
这是近乎完美的解决方案。唯一应该添加的小东西是检查空字段。HTML5 'email' 类型接受空字符串作为有效输入。
4赞 Boldewyn 1/30/2022
我可能会重复一遍,但你注意到这句话了吗?input.required = true;
1赞 oelna 4/10/2022
同样值得考虑的是:它对未来的变化很健壮,因为它不会对实际的正则表达式进行硬编码。我喜欢这方面。
2赞 Boldewyn 9/20/2022
@KarlStephen说了什么。想想 Intranet 应用程序的 Web 应用。拒绝这样的电子邮件地址的浏览器比无用更糟糕。这将积极阻碍表格的正确填写。user@localhost
15赞 3 revs, 3 users 52%Tugrul #18

var testresults

function checkemail() {
  var str = document.validation.emailcheck.value
  var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
  if (filter.test(str))
    testresults = true
  else {
    alert("Please input a valid email address!")
    testresults = false
  }
  return (testresults)
}

function checkbae() {
  if (document.layers || document.getElementById || document.all)
    return checkemail()
  else
    return true
}
<form name="validation" onSubmit="return checkbae()">
  Please input a valid email address:<br />

  <input type="text" size=18 name="emailcheck">
  <input type="submit" value="Submit">
</form>

14赞 3 revs, 2 users 78%Linkmichiel #19

我对正则表达式的了解不是那么好。这就是为什么我首先使用简单的正则表达式检查一般语法,然后使用其他函数检查更具体的选项。这可能不是最好的技术解决方案,但这样我就可以更灵活、更快速。

我遇到的最常见的错误是空格(尤其是在开头和结尾),偶尔还有双点。

function check_email(val){
    if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('[email protected]'); // Returns false
check_email(' [email protected]'); // Returns false
check_email('[email protected]'); // Returns true
85赞 2 revs, 2 users 91%bvl #20

这是正确的 RFC822 版本。

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}

评论

0赞 D.A.H 8/18/2014
IDN 地址未验证 (info@üpöü.com)
0赞 pmiranda 2/3/2021
“a@a”返回 valid: jsfiddle.net/pmiranda/guoyh4dv
0赞 ruohola 9/29/2021
@pmiranda 这是一个有效的电子邮件地址。
0赞 pmiranda 9/29/2021
@ruohola它没有顶级域名(用句点分隔)datatracker.ietf.org/doc/html/rfc3696
3赞 ruohola 9/29/2021
@pmiranda 例如 是某人的有效域,因此他们可以使用例如 作为他们的电子邮件。http://aia@ai
37赞 3 revs, 3 users 33%Learner #21

只需检查输入的电子邮件地址是否有效,即可使用 HTML。

<input type="email"/>

无需编写用于验证的函数。

评论

0赞 1/22/2022
这是最简单的解决方案,我们还可以使用外部库(如电子邮件验证器)来简化事情,qawithexperts.com/article/javascript/...
90赞 7 revs, 5 users 57%Colonel Panic #22

所有电子邮件地址都包含一个“at”(即 @)符号。测试该必要条件:

email.includes('@')

或者,如果您需要支持 IE/旧版浏览器:

email.indexOf('@') > 0

不要为任何更复杂的事情而烦恼。即使您可以完美地确定一封电子邮件在 RFC 语法上是否有效,也无法告诉您它是否属于提供它的人。这才是真正重要的。

若要测试这一点,请发送验证消息。

评论

22赞 iwazovsky 4/26/2015
如果有多个“@”符号怎么办?其他受限制的符号?此验证不可信...
0赞 Aravin 12/20/2020
a@b有效的电子邮件吗?
4赞 David Mårtensson 2/17/2021
它比大多数都好,是的,你可以有多个@,但这也可以是有效的电子邮件,如“@”@mydomain.jskd 或 elldffs(这是 @ comment)@mydomain.kjfdij。两者都是语法上有效的电子邮件
2赞 ruohola 9/29/2021
@Aravin 是的。
2赞 John Montgomery 1/20/2022
@iwazovsky 如果您使用字符串级验证来确定是否可以“信任”输入的电子邮件,那么您已经做错了。将它用于捕获错误以外的任何事情都是一个失败的原因,并且大多数没有被捕获的错误无论如何都是任何正则表达式都无法捕获的,因为它们可能仍然看起来像一封有效的电子邮件。
3赞 3 revs, 3 users 84%Simon Steele #23

如果使用的是 Closure,则可以使用内置类型:goog.format.EmailAddress

http://docs.closure-library.googlecode.com/git/class_goog_format_EmailAddress.html

例如:

goog.format.EmailAddress.isValidAddrSpec("[email protected]")

请注意,通过阅读源代码(上面链接),您可以看到注释指出不支持 IDN,并且它仅旨在涵盖大多数地址:

// This is a fairly naive implementation, but it covers 99% of use cases.
// For more details, see http://en.wikipedia.org/wiki/Email_address#Syntax
// TODO(mariakhomenko): we should also be handling i18n domain names as per
// http://en.wikipedia.org/wiki/Internationalized_domain_name
21赞 4 revs, 3 users 85%pera #24

node-validator 是这样做的:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/
17赞 3 revs, 3 users 60%Orchid #25

在验证器函数中使用以下代码:

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

否则,您可以使用jQuery。内部规则定义:

eMailId: {
    required: true,
    email: true
}
7赞 3 revs, 3 users 63%Neil Thompson #26

Microsoft 在 MVC 中提供的正 ASP.NET 表达式是

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

我在这里发布以防它有缺陷 - 尽管它一直非常适合我的需求。

评论

1赞 Paul Gordon 3/9/2015
不允许在电子邮件的名称部分中使用 +。
3赞 Ferrakkem Bhuiyan #27
<pre>
**The personal_info part contains the following ASCII characters.
1.Uppercase (A-Z) and lowercase (a-z) English letters.
2.Digits (0-9).
3.Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~
4.Character . ( period, dot or fullstop) provided that it is not the first or last character and it will not come one after the other.**
</pre>
*Example of valid email id*
<pre>
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
</pre>
<pre>
xxxx.ourearth.com [@ is not present] 
[email protected] [ tld (Top Level domain) can not start with dot "." ]
@you.me.net [ No character before @ ]
[email protected] [ ".b" is not a valid tld ]
[email protected] [ tld can not start with dot "." ]
[email protected] [ an email should not be start with "." ]
xxxxx()*@gmail.com [ here the regular expression only allows character, digit, underscore and dash ]
[email protected] [double dots are not allowed
</pre>
**javascript mail code**

    function ValidateEmail(inputText)
    {
    var mailformat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
    if(inputText.value.match(mailformat))
    {
    document.form1.text1.focus();
    return true;
    }
    else
    {
    alert("You have entered an invalid email address!");
    document.form1.text1.focus();
    return false;
    }
    }

评论

0赞 Janspeed 7/12/2023
我可能错误地读取了您的正则表达式,但似乎您只允许 2-3 个字符作为顶级域?en.wikipedia.org/wiki/List_of_Internet_top-level_domains
0赞 Yogesh Jindal #28

我的一位同事与我分享了这个正则表达式。我非常喜欢它。

function isValidEmailAddress (email) {
    var validEmail = false;
    if (email) {
        email = email.trim().toLowerCase();
        var pattern = /^[\w-']+(\.[\w-']+)*@([a-zA-Z0-9]+[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*?\.[a-zA-Z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/;
        validEmail = pattern.exec(email);
    }

    return validEmail;
}

if (typeof String.prototype.trim !== 'function') {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
    };
}
5赞 2 revszeros-ones #29

这是我用于前端电子邮件验证的函数。(正则表达式来自 parsley .js)

<!DOCTYPE html>
<html>
<head>
    <title>Our Company</title>
    <style>
        .form-style {
            color: #ccc;
        }
    </style>
</head>
<body>
    <h1>Email Validation Form Example</h1>
    <input type="text" name="email" id="emailInput" class="form-style">
    <script>
        function validateEmail(emailAddress) {
            var regularExpression = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))){2,6}$/i;
             return regularExpression.test(emailAddress);
        }

        function showEmailValidationState(event) {
            if (validateEmail(event.target.value)) {
                document.getElementById("emailInput").style.color = 'black';
            }
        }
    document.getElementById("emailInput").addEventListener("keyup", showEmailValidationState);
    </script>
</body>
</html>
1赞 4 revs, 2 users 88%Vitalii Fedorenko #30

如果您使用的是 AngularJS,只需添加到输入元素中:type="email"

https://docs.angularjs.org/api/ng/input/input%5Bemail%5D

如果没有输入元素,可以动态创建它:

var isEmail = $compile('<input ng-model="m" type="email">')($rootScope.$new()).
    controller('ngModel').$validators["email"];

if (isEmail('[email protected]')) {
  console.log('valid');
} 

评论

0赞 Bergi 12/15/2014
但是这个电子邮件解析器函数是什么?你能发布它,以便人们可以在没有角度的情况下使用它吗?
0赞 Eric Bishard 8/24/2015
是的,如果您要发布黑匣子答案,请挖掘电子邮件解析器函数后面的正则表达式,并向我们展示它正在使用什么。
1赞 2 revsuser2081554 #31

我知道它不是正则表达式,但无论如何......

这是 node 和 npm 包 email-existence 的示例,这是最终检查电子邮件是否存在以及其形式是否正确:)

如果电子邮件有响应,这将 ping 电子邮件,如果它没有得到响应,它将返回 false 或 true。

function doesEmailExist(email) {
    var emailExistence = require('email-existence');
    return emailExistence.check(email,function (err,status) {
            if (status) {
                return status;
            }
            else {
                throw new Error('Email does not exist');
            }
        });
}
4赞 2 revs, 2 users 89%jolly.exe #32

以下正则表达式验证:

  • @ 之前没有空格字符
  • (-) 和 (.) 不应在一起 @ 后 @ 后无特殊字符 @ 前必须有 2 个字符 电子邮件长度应少于 128 个字符
function validateEmail(email) {
var chrbeforAt = email.substr(0, email.indexOf('@'));
if (!($.trim(email).length > 127)) {
    if (chrbeforAt.length >= 2) {
        var re = /^(([^<>()[\]{}'^?\\.,!|//#%*-+=&;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
        //var re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
        return re.test(email);
    } else {
        return false;
    }
} else {
    return false;
}
}
2赞 2 revs, 2 users 74%jolly.exe #33

以下正则表达式验证:

  • @ 之前没有空格字符
  • (-) 和 (.) 不应在 @ 之后一起
  • @ 2 个字符后不得有特殊字符@
  • 电子邮件长度应少于 128 个字符

    function validateEmail(email) {
        var chrbeforAt = email.substr(0, email.indexOf('@'));
        if (!($.trim(email).length > 127)) {
            if (chrbeforAt.length >= 2) {
                var re = /^(([^<>()[\]{}'^?\\.,!|//#%*-+=&;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
                return re.test(email);
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    
0赞 2 revs, 2 users 72%jaydev thakkar #34
\b[a-z][\w\d_\.]+@\w+\.[a-z]{2}[a-z]?\.?[a-z]{,2}\s

它允许:

[email protected]    
abc12[email protected]   
[email protected]   
[email protected]

评论

0赞 Kamal Nayan 3/14/2016
不错的尝试:这里有 2 个更新:对于匹配范围,我们提供 .空白是错误,但可以有空白。我的意思是错了,写成.此外:您的正则表达式显示为有效,但无效!{min,max}minmax[a-z]{,2}{0,2}kamal@_gmail.com
3赞 DestyNova #35

最好的一个:D(RFC 友好且没有错误“太复杂”):

function    isMail(mail)
{
    pattuser = /^([A-Z0-9_%+\-!#$&'*\/=?^`{|}~]+\.?)*[A-Z0-9_%+\-!#$&'*\/=?^`{|}~]+$/i;
    pattdomain = /^([A-Z0-9-]+\.?)*[A-Z0-9-]+(\.[A-Z]{2,9})+$/i;

    tab = mail.split("@");
    if (tab.length != 2)
        return false;
    return (pattuser.test(tab[0]) && pattdomain.test(tab[1]));
}
1赞 2 revsDinesh Devkota #36

如果你想使用Jquery,并且想要有现代的方法,那么使用带有验证的JQuery输入掩码。

http://bseth99.github.io/projects/jquery-ui/5-jquery-masks.html

关于jquery输入掩码有多简单的演示在这里:http://codepen.io/anon/pen/gpRyBp

日期的简单输入掩码示例,例如 NOT 完全验证

 <input id="date" type="text" placeholder="YYYY-MM-DD"/>

和脚本:

 $("#date").mask("9999-99-99",{placeholder:"YYYY-MM-DD"});
6赞 cyberrspiritt #37

最佳做法是使用 HTML5 内置电子邮件标记。

<input type="email" name="email">

或常见的电子邮件语法,如识别 @ 和 .从下面给出的字符串。

^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$

请注意,这仍会生成无效的电子邮件,但仍会匹配 正则表达式,几乎不可能全部捕获它们,但这将 稍微改善一下情况。

评论

0赞 aNewb 12/3/2020
请参阅前面的评论 32 这很好,但问题是它必须在表单标签内并由提交输入提交,这不是每个人都能做到的。此外,您无法真正设置错误消息的样式。– @Jason Nov 12 '11 at 0:08
208赞 Andrew #38

我发现这是最好的解决方案:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

它允许以下格式:

1.  [email protected]
2.  [email protected]
3.  [email protected]
4.  [email protected]
9.  #!$%&'*+-/=?^_`{}|[email protected]
6.  "()[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
7.  " "@example.org (space between the quotes)
8.  üñîçøðé@example.com (Unicode characters in local part)
9.  üñîçøðé@üñîçøðé.com (Unicode characters in domain part)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Greek)
12. 我買@屋企.香港 (Chinese)
13. 甲斐@黒川.日本 (Japanese)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

它显然是通用的,允许所有重要的国际字符,同时仍然执行基本的 [email protected] 格式。它将阻止 RFC 在技术上允许的空间,但它们非常罕见,我很乐意这样做。

4赞 2 revs, 2 users 89%Priya #39

使用正则表达式:

 /^[a-z][a-zA-Z0-9_.]*(\.[a-zA-Z][a-zA-Z0-9_.]*)?@[a-z][a-zA-Z-0-9]*\.[a-z]+(\.[a-z]+)?$/

例:

function validateEmail(email) {
    var re = /^[a-z][a-zA-Z0-9_.]*(\.[a-zA-Z][a-zA-Z0-9_.]*)?@[a-z][a-zA-Z-0-9]*\.[a-z]+(\.[a-z]+)?$/;
    return re.test(email);
}

它应该只允许 @ , ., _

53赞 2 revs, 2 users 97%Keith Lee #40

我真的很期待解决这个问题。 所以我修改了上面的电子邮件验证正则表达式

  • 源语言
    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

  • 改 性
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

以传递维基百科电子邮件地址中的示例。

你可以在这里看到结果。

enter image description here

3赞 3 revsKentonbmax #41

如果您使用 ng-pattern 和 material,则可以完成这项工作。

vm.validateEmail = '([a-zA-Z0-9_.]{1,})((@[a-zA-Z]{2,})[\\\.]([a-zA-Z]{2}|[a-zA-Z]{3}))';
2赞 chemic #42

无论谁使用@pvl解决方案并希望它传递 ESLint Prefer-template,那么这是我使用模板文字而不是字符串连接的版本。

validateEmail(email) {
    let sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
    let sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
    let sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
    let sQuotedPair = '\\x5c[\\x00-\\x7f]';
    let sDomainLiteral = `\\x5b(${sDtext}|${sQuotedPair})*\\x5d`;
    let sQuotedString = `\\x22(${sQtext}|${sQuotedPair})*\\x22`;
    let sDomainRef = sAtom;
    let sSubDomain = `(${sDomainRef}|${sDomainLiteral})`;
    let sWord = `(${sAtom}|${sQuotedString})`;
    let sDomain = `${sSubDomain}(\\x2e${sSubDomain})*`;
    let sLocalPart = `${sWord}(\\x2e${sWord})*`;
    let sAddrSpec = `${sLocalPart}\\x40${sDomain}`; // complete RFC822 email address spec
    let sValidEmail = `^${sAddrSpec}$`; // as whole string

    let reValidEmail = new RegExp(sValidEmail);

    return reValidEmail.test(email);
}
13赞 7 revs, 5 users 59%Prabhat Kasera #43

用于验证电子邮件地址的正则表达式

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])+
19赞 2 revsbman #44

不检查 TLD 是否存在的解决方案是不完整的。

几乎所有对这个问题的回答都建议使用正则表达式来验证电子邮件地址。我认为正则表达式只适用于基本的验证。似乎电子邮件地址的检查验证实际上是两个独立的问题:

1-电子邮件格式的验证:确保电子邮件是否符合 RFC 5322 中电子邮件的格式和模式,以及 TLD 是否确实存在。可以在此处找到所有有效 TLD 的列表。

例如,尽管该地址将传递正则表达式,但它不是有效的电子邮件,因为它不是 IANA 的顶级域名。[email protected]ccc

2-确保电子邮件确实存在:为此,唯一的选择向用户发送电子邮件

10赞 4 revs, 3 users 82%Negin #45

我一直在寻找一个通过所有电子邮件地址测试用例的 JS 正则表达式:

来吧:

http://regexr.com/3f07j

或正则表达式:

Regex = /(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@[*[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+]*/
2赞 Himanshu Teotia #46

在nodeJS中,你也可以使用验证器节点模块,这样就可以了

使用 npm install validator 安装库

var validator = require('validator');

validator.isEmail('[email protected]'); //=> true 
0赞 Jangli Coder #47

如果将正则表达式定义为字符串,则需要对所有反斜杠进行转义,因此应使用“\w”而不是“\w”。

或者,将其定义为正则表达式:

var pattern = /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/; 
2赞 Abhay Shiro #48

这里写了一些复杂的正则表达式,也有效。

我测试了这个,它也可以工作:

[a-zA-Z0-9._]+[@]+[a-zA-Z0-9]+[.]+[a-zA-Z]{2,6}

请在这里测试一下:http://www.regextester.com/?fam=97334

希望这会有所帮助。

评论

0赞 Agi Hammerthief 2/2/2018
me@localhost失败。
1赞 takatan #49

我想添加一个关于非 ASCII 字符的简短说明。Rnevius(和公司)的解决方案非常出色,但它允许添加西里尔文、日语、表情符号和其他可能受到某些服务器限制的 unicode 符号。

下面的代码将打印出来,尽管它包含 UTF-8 字符。trueЁ

console.log (/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test ('Ё@example.org'))

就我而言,所有非 ASCII 符号都被禁止,因此我修改了原始表达式以排除 U+007F 以上的所有字符:

/^(([^\u0080-\uffff<>()\[\]\\.,;:\s@"]+(\.[^\u0080-\uffff<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

也许这将有助于某人防止不良行为。

评论

0赞 jcollum 8/14/2017
不,我认为这是一个足够不寻常的用例,它应该是它自己的答案
2赞 2 revsAlireza #50

如何创建一个函数,该函数将使用 JavaScript 中的正则表达式根据电子邮件模式测试任何字符串,因为我们知道电子邮件地址在不同地区可能会有很大不同,例如在英国和澳大利亚,它通常以 or 结尾,所以我也尝试涵盖这些,还要检查传递给函数的字符串, 像这样的东西:.co.uk.com.au

var isEmail = function(str) {
  return typeof str==='string' && /^[\w+\d+._]+\@[\w+\d+_+]+\.[\w+\d+._]{2,8}$/.test(str);
}

并检查它是否是如下所示的电子邮件:

isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]'); //true
isEmail('[email protected]#sswzazaaaa'); //false
isEmail('[email protected]'); //false

评论

0赞 Agi Hammerthief 2/2/2018
或会发生什么?[email protected]phil.h\@\@[email protected]
32赞 3 revs, 2 users 98%Liberateur #51

维基百科标准邮件语法:

https://en.wikipedia.org/wiki/Email_address#Examples https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte

功能:

function validMail(mail)
{
    return /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+([^<>()\.,;:\s@\"]{2,}|[\d\.]+))$/.test(mail);
}

有效电子邮件 :

validMail('[email protected]') // Return true
validMail('[email protected].') // Return true
validMail('[email protected]') // Return true
validMail('user@localserver') // Return true
validMail('[email protected]') // Return true
validMail('user+mailbox/[email protected]') // Return true
validMail('"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}[email protected]') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"Abc@def"@example.com') // Return true
validMail('"Fred Bloggs"@example.com') // Return true
validMail('"Joe.\\Blow"@example.com') // Return true
validMail('Loïc.Accentué@voilà.fr') // Return true
validMail('" "@example.org') // Return true
validMail('user@[IPv6:2001:DB8::1]') // Return true

无效电子邮件:

validMail('Abc.example.com') // Return false
validMail('A@b@[email protected]') // Return false
validMail('a"b(c)d,e:f;g<h>i[j\k][email protected]') // Return false
validMail('just"not"[email protected]') // Return false
validMail('this is"not\[email protected]') // Return false
validMail('this\ still\"not\\[email protected]') // Return false
validMail('[email protected]') // Return false
validMail('[email protected]') // Return false

显示此测试: https://regex101.com/r/LHJ9gU/1

评论

0赞 Brian Ho 9/16/2022
此地址“abc@example”应返回 false,但返回 true。wiki 页面提到:“它必须符合主机名的要求”en.wikipedia.org/wiki/Email_address#Domain
0赞 Muhammad Shahzad 9/19/2022
abc.def@mail返回 true :(
2赞 Behnam #52

ES6 示例

const validateEmail=(email)=> /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(email);
4赞 3 revs, 2 users 72%hmharsh3 #53

您也可以尝试

var string = "[email protected]"
var exp = /(\w(=?@)\w+\.{1}[a-zA-Z]{2,})/i
alert(exp.test(string))
29赞 6 revs, 3 users 82%Juan Pablo #54

正则表达式已更新!试试这个

let val = '[email protected]';
if(/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

TypScript 版本完成

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

更多信息 https://git.io/vhEfc

regex test case

评论

0赞 jimmont 7/26/2022
我不认为这对世界上大部分地区有用,而且对许多客户来说也是一个不平凡的受众。对于国际化的用户名和域,它失败。我下面的答案是使用 URL 接口解决这个问题的,该接口已经在大多数运行时中内置了支持。编号: stackoverflow.com/a/72018404/965666
0赞 Brian Ho 9/16/2022
也许使正则表达式不区分大小写。否则,它将使带有大写字符的电子邮件地址失败。
1赞 Mizanur Rahaman #55
 <input type="email" class="form-control" required="required" placeholder="Email Address" name="Email" id="Email" autocomplete="Email">
 <button class="btn-1 shadow-0 full-width" type="button" id="register">Register account</button>

 $("#register").click(function(){       
    var rea = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
    var Email = $("#Email").val();
    var x = rea.test(Email);
    if (!x) {
        alert('Type Your valid Email');
        return false;
    }           
 </script>
2赞 Menelaos Kotsollaris #56

这是一个简单的正则表达式,它只会检查电子邮件的基本格式,例如:[email protected]

\S+@\S+\.\S+

2赞 4 revsJoelBonetR #57

这个问题比乍一看更难回答。

世界各地有很多人在寻找“统治一切的正则表达式”,但事实是,电子邮件提供商的语气是有的。

怎么了?好吧,“a_z%@gmail.com 不可能存在,但它可能通过另一个提供商存在这样的地址”[email protected]。

为什么? 根据 RFC: https://en.wikipedia.org/wiki/Email_address#RFC_specification.

我将摘录一段话来促进讲座:

The local-part of the email address may use any of these ASCII characters:

- uppercase and lowercase Latin letters A to Z and a to z;
- digits 0 to 9;
- special characters !#$%&'*+-/=?^_`{|}~;
- dot ., provided that it is not the first or last character unless quoted, and provided also that it does not appear consecutively unless quoted (e.g. [email protected] is not allowed but "John..Doe"@example.com is allowed);[6]
Note that some mail servers wildcard local parts, typically the characters following a plus and less often the characters following a minus, so fred+bah@domain and fred+foo@domain might end up in the same inbox as fred+@domain or even as fred@domain. This can be useful for tagging emails for sorting, see below, and for spam control. Braces { and } are also used in that fashion, although less often.
- space and "(),:;<>@[\] characters are allowed with restrictions (they are only allowed inside a quoted string, as described in the paragraph below, and in addition, a backslash or double-quote must be preceded by a backslash);
- comments are allowed with parentheses at either end of the local-part; e.g. john.smith(comment)@example.com and (comment)john.s[email protected] are both equivalent to [email protected].

所以,我可以拥有这样的电子邮件地址:

A__z/J0hn.sm{it!}[email protected]

如果您尝试此地址,我敢打赌它将在网络上发布的全部或主要正则表达式中失败。但请记住,此地址遵循 RFC 规则,因此它是公平有效的。

想象一下,我无法在使用这些正则表达式检查的任何地方注册而感到沮丧!

唯一真正可以验证电子邮件地址的人是电子邮件地址的提供者。

怎么处理呢?

在几乎所有情况下,用户是否添加无效电子邮件都无关紧要。您可以依靠在 RFC 附近运行的 HTML 5 input type=“email”,失败的可能性很小。 HTML5 input type=“email” 信息:https://www.w3.org/TR/2012/WD-html-markup-20121011/input.email.html

例如,这是一封 RFC 有效电子邮件:

"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com

但是 html5 验证会告诉你,@ 前面的文本不能包含 “ 或 () 字符,例如,这实际上是不正确的。

无论如何,您应该通过接受电子邮件地址并向该电子邮件地址发送电子邮件来执行此操作,并附上用户必须访问的代码/链接以确认有效性。

执行此操作时,一个好的做法是“再次输入您的电子邮件”输入,以避免用户键入错误。如果这对你来说还不够,请添加一个提交前的模态窗口,标题为“这是你当前的电子邮件吗?”,然后是用户在 h2 标签中输入的邮件,你知道,以清楚地显示他们输入了哪个电子邮件,然后添加一个“是,提交”按钮。

6赞 3 revsSbbs #58

这是数千个网站使用的官方 Rails 指南所建议的验证的 JavaScript 翻译:

/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i

相对简单,但针对最常见的错误进行测试。

在包含数千封电子邮件的数据集上进行了测试,结果为零误报/漏报。

用法示例:

const emailRegex = /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i;

emailRegex.test('[email protected]');    // true

// Multi-word domains
emailRegex.test('[email protected]');  // true
emailRegex.test('[email protected]'); // true

// Valid special characters
emailRegex.test('unusual+but+valid+email1900=/!#$%&\'*+-/=?^_`.{|}[email protected]') // true

// Trailing dots
emailRegex.test('[email protected].'); // false

// No domain
emailRegex.test('email@example');        // false

// Leading space
emailRegex.test(' [email protected]');   // false

// Trailing space
emailRegex.test('[email protected] ');   // false

// Incorrect domains
emailRegex.test('email@example,com ');   // false

// Other invalid emails
emailRegex.test('invalid.email.com')        // false
emailRegex.test('invalid@[email protected]') // false
emailRegex.test('[email protected]')       // false
1赞 4 revsaabiro #59

下面是一个有效的解决方案,并在表单中包含验证/通知功能:

您可以在此链接上运行

JAVASCRIPT的

(function() {
  'use strict';

  window.addEventListener('load', function() {
    var form = document.getElementById('needs-validation');
    form.addEventListener('submit', function(event) {
      if (form.checkValidity() === false) {
        event.preventDefault();
      }
      form.classList.add('was-validated');
      event.preventDefault();              
    }, false);
  }, false);
})();

[HTML全文]

<p class='title'>
    <b>Email validation</b>
  <hr size="30px;">
</p>
<br>

<form id="needs-validation" novalidate>
  <p class='form_text'>Try it out!</p>
  <div class="form-row">
    <div class="col-12">
      <input type="email" class="form-control" placeholder="Email Address" required>
        <div class="invalid-feedback">
          Please enter a valid email address.
        </div>
    </div>
  <div class="row">
    <div class="col-12">
      <button type="submit" 
          class="btn btn-default btn-block">Sign up now
      </button>
    </div>
   </div>
</form>
1赞 mpyw #60

我编写了一个 JavaScript 电子邮件验证器,它与 PHP 的实现完全兼容。filter_var($value, FILTER_VALIDATE_EMAIL)

https://github.com/mpyw/FILTER_VALIDATE_EMAIL.js

import validateEmail from 'filter-validate-email'

const value = '...'
const result = validateEmail(value)

相当于:

<?php

$value = '...';
$result = (bool)filter_var($value, FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_UNICODE);
3赞 2 revsisapir #61

以下是 MDN 上 HTML5 的推荐正则表达式模式:

支持电子邮件输入类型的浏览器会自动提供验证,以确保只有与 Internet 电子邮件地址的标准格式匹配的文本才会输入到输入框中。实现该规范的浏览器应使用与以下正则表达式等效的算法:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}
[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

1赞 incalite #62

这是我是如何做到的。我正在使用 match() 来检查标准电子邮件模式,并在输入文本中添加一个类以相应地通知用户。希望对您有所帮助!

$(document).ready(function(){
  $('#submit').on('click', function(){
      var email = $('#email').val();
      var pat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
      if (email.match(pat)){
        $('#email')
          .addClass('input-valid');
        return false;
      } else {
        $('#email')
        	.addClass('input-error')
          .val('');
        return false;
      }
  });
});
.input-error {
  border: 1px solid red;
  color: red;
}

.input-valid {
  border: 1px solid green;
  color: green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
    <input type="text" id="email" placeholder="[email protected]" class="">
    <input type="submit" id="submit" value="Send"/>
</form>

0赞 3 revs, 2 users 95%B. Bohdan #63

这是我的电子邮件验证器版本。此代码通过面向对象的编程完成,并作为具有静态方法的类实现。你会发现验证器的两个版本:strict() 和 kind()。EmailValidator.validateEmailValidator.validateKind

如果电子邮件无效,则第一个会引发错误,否则会返回电子邮件。第二个返回布尔值,该值表示电子邮件是否有效。在大多数情况下,我更喜欢严格版本。

export class EmailValidator {
    /**
     * @param {string} email
     * @return {string}
     * @throws {Error}
     */
    static validate(email) {
        email = this.prepareEmail(email);

        const isValid = this.validateKind(email);

        if (isValid)
            return email;

        throw new Error(`Got invalid email: ${email}.`);
    }

    /**
     * @param {string} email
     * @return {boolean}
     */
    static validateKind(email) {
        email = this.prepareEmail(email);

        const regex = this.getRegex();

        return regex.test(email);
    }

    /**
     * @return {RegExp}
     * @private
     */
    static getRegex() {
        return /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    }

    /**
     * @param {string} email
     * @return {string}
     * @private
     */
    static prepareEmail(email) {
        return String(email).toLowerCase();
    }
}

要验证电子邮件,您可以按照以下方式操作:

// First way.

try {
    EmailValidator.validate('balovbo[email protected]');
} catch (e) {
    console.error(e.message);
}
// Second way.

const email = '[email protected]';
const isValid = EmailValidator.validateKind(email);

if (isValid)
    console.log(`Email is valid: ${email}.`);
else
    console.log(`Email is invalid: ${email}.`);
0赞 Raheel #64

我正在使用这个功能

/**
 * @param {*} email
 */
export const validateEmail = email => {
    return new RegExp(/[\w-]+@([\w-]+\.)+[\w-]+/gm).test(email);
};

评论

1赞 oligofren 9/24/2019
不适用于 Unicode。.忘记使用这样的检查进行验证。测试并仅向用户发送电子邮件。validateEmail('køkø@gmail.com') === false@
2赞 2 revs, 2 users 71%Antonio #65

常规电子邮件正则表达式(RFC 5322 官方标准):https://emailregex.com/

JavaScript的:

/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
1赞 3 revs, 2 users 86%Nicolas Zozol #66

如果你想要一些人类可以阅读和维护的东西,我会推荐 Masala Parser(我是它的创建者之一)。

import {C,Streams} from '@masala/parser'

const illegalCharset = ' @\u00A0\n\t';
const extendedIllegalCharset = illegalCharset + '.';


// Assume '[email protected]'
export function simpleEmail() {

    return C.charNotIn(illegalCharset).rep() // 'nicolas'
        .then(C.char('@'))
        .then(subDns())  //'internal.masala.co.'
        .then(C.charNotIn(extendedIllegalCharset).rep()) //'uk'
        .eos(); // Must be end of the char stream
}

// [email protected] => extract 'internal.masala.co.'
function  subDns() {
    return C.charNotIn(extendedIllegalCharset).rep().then(C.char('.')).rep()
}

function validateEmail(email:string) {
    console.log(email + ': ' + (simpleEmail().parse(Streams.ofString(email)).isAccepted()));
}


validateEmail('[email protected]'); // True
validateEmail('nz@co.'); // False, trailing "."

如果你想接受最终丑陋的电子邮件版本,你可以在第一部分添加引号:


function inQuote() {
    return C.char('"')
        .then(C.notChar('"').rep())
        .then(C.char('"'))
}

function allEmail() {

    return inQuote().or(C.charNotIn(illegalCharset))
        .rep() // repeat (inQuote or anyCharacter)
        .then(C.char('@'))
        .then(subDns())
        .then(C.charNotIn(extendedIllegalCharset).rep())
        .eos() // Must be end of the character stream
        // Create a structure
        .map(function (characters) { return ({ email: characters.join('') }); });
}

'"nicolas""love-quotes"@masala.co.uk'是正式有效的,但它应该在你的系统中吗?

至少在Masala,你给自己一个理解它的机会。所以明年,同事。

2赞 5 revsjimmont #67

使用浏览器/运行时通过预置协议并将其传递给 API 来处理输入解析,捕获任何错误并检查结果和结果的属性。它基本上可以处理所有转换和可能性(字符集的 punycode 等)。这只能确定输入是可解析的,而不是有效的 - 这只能通过检查目标计算机是否收到该别名的消息来实现。不过,这提供了一个接近(imo 合理)的猜测,如果您愿意维护它并冒着无效拒绝的风险,则可以将其扩展为更具体和现实。(请注意,它不会尝试寻址 IPv4 或 IPv6 地址,而只是使用域处理面向客户的各种方案。URLusernamehostname

function validEmail(email=''){
    var $0, url, isValid = false, emailPatternInput = /^[^@]{1,64}@[^@]{4,253}$/, emailPatternUrl = /^[^@]{1,64}@[a-z][a-z0-9\.-]{3,252}$/i;
    email = email.trim();
    try{
        url = new URL('http://'+email);
        $0 = `${url.username}@${url.hostname}`;
        isValid = emailPatternInput.test( email );
        if(!isValid) throw 'invalid email pattern on input:' + email;
        isValid = emailPatternUrl.test( $0 );
        if(!isValid) throw 'invalid email pattern on url:' + $0;
        console.log(`email looks legit "${email}" checking url-parts: "${$0 === email ? '-SAME-':$0}"`);
    }catch(err){
        console.error(`probably not an email address: "${email}"`, err);
    };
    return isValid;
}

['user+this@はじめよう.みんな', 'stuff@things', '[email protected]', 'Jean+Franç[email protected]','هيا@יאללה', '试@例子.测试.مثال.آزمایشی', 'not@@really', 'no'].forEach(email=>console.log(validEmail(email), email));

这是我能想到的最简单和最普遍的例子。请在可以使它更准确的情况下对其进行编辑,同时保持其简单性和合理的普遍许可有效性。

另请参阅 MDN URL 文档 URL、窗口。URLNodejs 用于 URL API。

1赞 4 revsZOLDIK #68

这些将适用于最常用的电子邮件(它们与每个电子邮件的规则完全匹配)。

Gmail


雅虎


、Outlook/Hotmail
/^[a-z]((?!\.\.)([a-z\.])){4,28}[a-z0-9]@gmail.com$/i/^[a-z]((?!\.\.)([\w\.])){3,30}[\w]@yahoo.com$/i
/[a-z]((?!\.\.)([\w\.])){0,62}[\w]@(outlook.com|hotmail.com)$/i

评论

0赞 Toto 11/18/2019
你知道已经包括和了吗?请看一下这些网站:TLD列表;有效/无效地址;RFC822 电子邮件地址的正则表达式\w\d_
0赞 Eboubaker 11/22/2019
@Toto没错,我不知道我是怎么把它弄丢的,我实际上在我的数据库处理:\中使用了这个正则表达式,再次感谢。
0赞 David Wheatley 1/22/2020
Gmail 的域名不是 ,它是 或(对于非常旧的帐户)@google.com@gmail.com@googlemail.com
10赞 3 revs, 3 users 93%Renish Gotecha #69

就我而言,我想避免,这就是为什么我使用了另一种解决方案~#

function validEmail(email){
  const regex = /^((?!\.)[\w\-_.]*[^.])(@\w+)(\.\w+(\.\w+)?[^.\W])$/;
  return regex.test(email);
}

function validEmail(email){
  const regex = /^((?!\.)[\w\-_.]*[^.])(@\w+)(\.\w+(\.\w+)?[^.\W])$/;
  return regex.test(email);
}

const emails = [
'[email protected]',
'[email protected]',
'[email protected]',
'pio_#[email protected]',
'pio_pio@#factory.com',
'[email protected]#om',
'[email protected]*om',
'pio^[email protected]'
]

for(const email of emails){
  document.write(email+' : '+validEmail(email)+'</br>');
}

评论

0赞 DroidOS 9/29/2021
这个答案 - 以及这个线程中的其他几个答案 - 不会转义连字符。据我所知(2021 年 9 月),这在浏览器中没有问题——至少是 Webkit 变体。但是,这可能会改变。在撰写本文时,PHP7.3 无法在不转义连字符的情况下编译正则表达式。通过转义连字符而不仅仅是 .\--
4赞 2 revs, 2 users 80%Mattia Rasulo #70

您可以使用此正则表达式(来自 w3resource(*与 W3C 无关)):

/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(emailValue)

如果您使用 Node,则可以在后端和前端使用它。

我不懂其他后端语言,所以我无法评估其他用例。

评论

4赞 Xizam 3/24/2020
此正则表达式在“[email protected]”和“[email protected]”上失败。请勿使用。
0赞 Mattia Rasulo 1/8/2021
user+addition 是有效的电子邮件,longdomain 不一定无效。
0赞 David Mårtensson 2/17/2021
确切地说,任何正则表达式都无法完全验证电子邮件的格式,即使可以,它也无法知道特定于域的规则,只需检查@并完成它或发送验证电子邮件。其他任何事情都只是自找麻烦。
11赞 2 revs, 2 users 95%endyourif #71

哇,有很多答案包含略有不同的正则表达式。我尝试了很多,我得到了不同的结果和各种不同的问题。

对于 UI 验证,我擅长寻找 @ 符号的最基本检查。需要注意的是,我总是使用标准的“验证电子邮件”进行服务器端验证,其中包含供用户确认其电子邮件地址的唯一链接。

if (email.indexOf('@') > 0)

即使从零开始,我也特意选择了 0,因为它还可以确保 @ 之前有一个字符。

8赞 user1843640 #72

我更喜欢保持简单,让我的用户满意。我也更喜欢易于理解的代码。正则表达式不是。

function isValidEmail(value) {
    const atLocation = value.lastIndexOf("@");
    const dotLocation = value.lastIndexOf("."); 
    return (
        atLocation > 0 &&
        dotLocation > atLocation + 1 &&
        dotLocation < value.length - 1
    );
};
  • 获取最后一个“@”和最后一个“”的位置。
  • 确保“@”不是第一个字符(在它之前有一些东西)
  • 确保“.”在“@”之后,并且它们之间至少有一个字符
  • 确保“”之后至少有一个字符。

这会允许无效的电子邮件地址通过吗?当然,但我认为您不需要更多来获得良好的用户体验,允许您启用/禁用按钮、显示错误消息等。只有当您尝试向该地址发送电子邮件时,您才能确定该地址是否有效。

评论

0赞 David Mårtensson 2/17/2021
对于以包含 @ 的评论结尾的电子邮件,这将失败,例如“[email protected](这是 @ 评论)”,这是一封有效的电子邮件
4赞 3 revs, 2 users 90%Jaskaran Singh #73

如果出现此错误:使用正则表达式对安全敏感。

那么这就是你要找的东西。此解决方案没有“正则表达式拒绝服务(ReDoS)”

用于验证电子邮件的正则表达式 (ReDoS):

/^[a-z0-9](?!.*?[^\na-z0-9]{2})[^\s@]+@[^\s@]+\.[^\s@]+[a-z0-9]$/

如果此解决方案适合您,请告诉我。 谢谢。

9赞 2 revs, 2 users 96%Ebrahim #74

这里的大多数答案都不是 linter 友好的,一团糟!其中一些也已经过时了! 在花费大量时间后,我决定使用一个名为 的外部库,例如通过 npm 轻松安装它,并在您自己的项目中导入/需要它:email-validator

https://www.npmjs.com/package/email-validator

//NodeJs
const validator = require("email-validator");
validator.validate("[email protected]"); // true

//TypeScript/JavaScript
import * as EmailValidator from 'email-validator';
EmailValidator.validate("[email protected]"); // true

评论

0赞 Stefan 10/20/2020
这不是问题的答案,但它帮助了我并节省了我的时间。这个电子邮件验证器包似乎每周帮助大约五十万次其他(下载)。所以值得一提,值得一些赞。
1赞 Nazmul Haque #75
     // Html form call function name at submit button

    <form name="form1" action="#"> 
    <input type='text' name='text1'/>
    <input type="submit" name="submit" value="Submit" 
    onclick="ValidateEmail(document.form1.text1)"/>
   </from>

    // Write the function name ValidateEmail below

    <script>
     function ValidateEmail(inputText)
    {
  var mailformat = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
    if(inputText.value.match(mailformat))
    {
    alert("Valid email address!");
    document.form1.text1.focus();
    return true;
    }
    else
   {
    alert("You have entered an invalid email address!");
    document.form1.text1.focus();
    return false;
    }
    }
   </script>
1赞 FDisk #76

电子邮件验证的另一个完美正则表达式

/^([^\s\@])+\@(([^\s\@\.])+\.)+([^\s\.]{2,})+$/

您可以在此处进行测试 https://regex101.com/r/FV3pUI/2

0赞 Force Bolt #77
// Try this regular Expression by ES6 function

const emailValidate = (email) => {
  const regexp= /^[\w.%+-]+@[\w.-]+\.[\w]{2,6}$/;
  return regexp.test(email);
}

评论

0赞 Jason Kohles 5/5/2022
这是一个很好的例子,说明为什么人们说不要为此使用正则表达式。仅举其中的一部分,即顶级域名将是 6 个字母或更少的断言。这拒绝了不到一半的有效 TLD —— 目前有超过 650 个 TLD 超过 6 个字符,您可以在 data.iana.org/TLD/tlds-alpha-by-domain.txt 上看到它们
3赞 jimmont #78

使用 JavaScript 中的接口以最小的实际预期格式解析地址,然后检查它看起来是否合理。接下来,向它发送一条消息,看看这是否有效(例如,要求收件人通过地址验证一次性令牌)。请注意,这处理的是 punycode、国际化,如以下示例所示。URLuser@host

https://developer.mozilla.org/en-US/docs/Web/API/URL

简单测试示例:

function validEmail(input=''){
    const emailPatternInput = /^[^@]{1,64}@[^@]{4,253}$/, emailPatternUrl = /^[^@]{1,64}@[a-z][a-z0-9\.-]{3,252}$/i;
    let email, url, valid = false, error, same = false;
    try{
        email = input.trim();
        // handles punycode, etc using browser's own maintained implementation
        url = new URL('http://'+email);
        let urlderived = `${url.username}@${url.hostname}`;
        same = urlderived === email;
        valid = emailPatternInput.test( email );
        if(!valid) throw new Error('invalid email pattern on input:' + email);
        valid = emailPatternUrl.test( urlderived );
        if(!valid) throw new Error('invalid email pattern on url:' + urlderived);
    }catch(err){
        error = err;
    };
    return {email, url, same, valid, error};
}

[
 'user+this@はじめよう.みんな'
, '[email protected]'
, 'stuff@things'
, '[email protected]'
, 'Jean+Franç[email protected]','هيا@יאללה'
, '试@例子.测试.مثال.آزمایشی'
, 'not@@really'
, 'no'
].forEach(email=>console.log(validEmail(email), email));
5赞 4 revsWatts Epherson #79

这个问题的答案(如果你退后一步认真考虑过)是,你无法真正阻止用户错误地输入他们的电子邮件。每个人都在提供与所有可能的字母相匹配的答案,但没有人真正考虑到可以使用的无数字符。

我向您推荐这篇文章和答案,解释可以接受的字符数量:- 从电子邮件中删除无效字符

你无法预测这些字母是否是用户想要的确切方式 - 这是最常见的错误。缺少一个字母或输入错误的字母。

归根结底,无论你在 Javascript 中做什么,你总是需要你的后端脚本来检查电子邮件是否也成功发送,并且它可能也有一个验证过程。

因此,如果你想确保它是某种电子邮件地址,而不是他们的用户名,你只需要检查那里是否有@符号和至少1个点,其余的都留给你的后端代码。

我提供了一个非常基本的函数,演示了实时输入的延迟检查和即时检查。Javascript 充当第一个检查点来验证基础知识,以节省发布无效内容和惹恼用户。

不过,它总是假设更大的支票在后端。

// Very simple, non-library dependent client-side  e-mail validator
var emailv = {

  // Timeout handler for checkDelay()
  to: null, 
  
  // The core function that takes a string and validates it
  check : function(em){
    
    // Check 1 - The split ensures there's only one @
    var c1 = em.split('@').length == 2;
    
    // Check 2 - Must be at least 1 dot too
    var c2 = em.indexOf('.') > 0;
    
    // Check 3 - ensures there's always something after a @ or dot
    var c3 = !(em.slice(-1)=="@"||em.slice(-1)==".");
    return (c1&&c2&&c3); // If all TRUE, great.
  },
  
  // Shortcut to quickly check any text input by dom id
  checkById : function(inputId){
    d = document.getElementById(inputId);
    return d?emailv.check(d.value):false;
  },
  
  // Check delay for checking on real-time inputs
  checkDelay: function(em){
      clearTimeout(emailv.to);
      emailv.to = setTimeout("emailv.checkDelayP2('"+em+"')",1000);
  },
  
  // Part two  of Check delay
  checkDelayP2: function(em){ 
      if(emailv.check(em)){ // Javascript filter says it seems okay

        // For sakes of this demo, pretend we are now making a background
        // check to see if e-mail is taken. We tell the user to wait..
        emailv.status("Wait..");

        // Pretend the background check took 2 seconds
        // and said e-mail was available
        setTimeout("emailv.status('OK')",2000);
      } else {
        // Javascript say it's bad, mmmkay?
         emailv.status("BAD E-mail");      
      }
  },
  
  status : function(s){
    document.getElementById('emailstatus').innerHTML=s;
  }
}
<h2>1 of 2 - Delayed check</h2>
<ul>
<li><strong>Waits until the user has stopped typing</strong></li>
<li>Useful for when you want to then send e-mail to background database to check if it exists.</li>
<li>Allows them 1 idle second before checking the e-mail address.</li>
</ul>
<input type="text" size="50" id="youremail" name="youremail" onkeyup="emailv.checkDelay(this.value)" onpaste="emailv.checkDelay(this.value)" />
<span id='emailstatus'></span>


<h2>2 of 2 - Instant Check</h2>
<input type="text" size="50" id="youremail2" name="youremail2" />
<a href="Javascript:void(0)" onclick="alert(emailv.checkById('youremail2')?'Seems okay to me':'This e-mail is dodgy')">Check e-mail</a>

最好避免阻止用户输入有效的电子邮件,而不是应用太多限制以使其变得复杂。

这只是我的意见!