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


4370

是否有正则表达式来验证JavaScript中的电子邮件地址?



60
请正确处理,太多网站不喜欢我的电子邮件地址“ firstName@secondName.name”,并非所有顶级域名都以2或3个字母结尾。
伊恩·林格罗斯

41
我对使用正则表达式检查电子邮件的任何支持都是100%反对的。告诉我我的电子邮件地址“ foo+bar@gmail.com”无效,我感到很累。最好的选择是要求用户输入两次电子邮件,如果您必须使用正则表达式检查器,然后告诉用户其电子邮件地址似乎无效,并询问他们是否确定键入了电子邮件。对。甚至可以指出在regexp检查中没有检出的内容,但不要阻止他们提交表单。
Soundfx4

17
@ Soundfx4:这应该是答案,并因此被接受。测试地址的正确性是一件愚蠢的事情,这是使客户沮丧的最佳方法。我要求输入两次该地址,并暗示存在一些可能的问题(缺少@;com等等),并让用户根据需要进行更正(并接受他们发送给我的任何内容)
WoJ

4
我完全同意WoJ的回答。有效电子邮件地址的格式过于复杂,无法使用简单的正则表达式进行检查。确保地址有效的唯一方法是尝试一下。
妮可

Answers:


4940

使用正则表达式可能是最好的方法。您可以在此处看到大量测试(取自

function validateEmail(email) {
    const 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(String(email).toLowerCase());
}

这是接受unicode的常规表达式的示例:

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

但是请记住,不应该只依赖JavaScript验证。可以轻松禁用JavaScript。这也应该在服务器端进行验证。

这是上述操作的一个示例:

function validateEmail(email) {
  const 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);
}

function 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 not valid :(");
    $result.css("color", "red");
  }
  return false;
}

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

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>


574
此正则表达式消除了有效的,正在使用的电子邮件。不使用。Google为“ RFC822”或“ RFC2822”获取适当的正则表达式。
兰德尔·施瓦茨

41
这甚至不接受RFC 822中的示例。在某些简单情况下,它与a \ @ b @ c.com,a(b)@ c.com不匹配。有关更多信息,请参见RFC。这是一个正则表达式,不会拒绝任何有效地址[^ @] + @ [^ @] + \。[^ @] +并防止常见错误。
Vroo 2012年

125
@GoodPerson我刚刚尝试给n @ ai发送电子邮件,告诉他/她他们有一个不错的电子邮件地址。但是可惜,gmail不允许我这样做。我怀疑通过电子邮件与他人进行交流的人,除了我网站的JavaScript验证之外,还有更大的问题!但是,感谢您接受挑战。
本·罗伯茨

26
对于大多数以英语为母语的人来说,这是一个不错的解决方案,但未通过土耳其测试(请参见Joel Spolsky)。允许使用大多数unicode字母,例如在阿根廷,“ñoñó1234@server.com”之类的地址是完全正常的。joelonsoftware.com/articles/Unicode.html
oligofren

139
您无法验证电子邮件地址,期限。唯一可以验证电子邮件地址的人是电子邮件地址的提供者。例如,此答案说这些电子邮件地址:%2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.com都是有效的,但Gmail绝不允许这些电子邮件地址中的任何一个。您应该通过接受电子邮件地址并向该电子邮件地址发送电子邮件来完成此操作,并提供用户必须访问以确认有效性的代码/链接。
凯文·费根

829

对于需要真正简单验证的人,我对Jaymon的答案做了一些修改:

anystring@anystring.anystring

正则表达式:

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

JavaScript函数示例:

function validateEmail(email) 
    {
        var re = /\S+@\S+\.\S+/;
        return re.test(email);
    }
    
console.log(validateEmail('anystring@anystring.anystring'));


69
您可以实施20倍的内容,这可能会给少数用户带来问题,并且将来可能不再有效,或者您可以获取ImmortalFirefly的版本,以确保他们至少在努力使其外观真实。根据您的应用程序,可能会遇到某个人会生气,因为您不接受他们的非常规电子邮件,而不是某个人通过输入不存在的电子邮件地址而导致问题(他们可以通过输入100%有效的RFC2822电子邮件地址,但使用未注册的用户名或域)。已投票!
user83358 2012年

82
@ImmortalFirefly,您提供的正则表达式实际上会匹配name@again@example.com。尝试将行粘贴到JavaScript控制台中。我相信您的意图是仅匹配整个文本,这将需要文本“ ^”的开头和文本“ $”的结尾。我正在使用的是/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
OregonTrail,2012年

8
基于此验证,此电子邮件有效:check @ this..com
Ehsan

4
维基百科说这"very.unusual.@.unusual.com"@example.com是一个有效的电子邮件地址。 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('"very.unusual.@.unusual.com"@example.com') // false。哎呀。
培根片

3
这还不允许@@@.@吗?:D
hfossli

762

为了完整起见这里有另一个符合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])?

您可以做的进一步更改是允许任何两个字母的国家/地区代码顶级域名,仅允许特定的通用顶级域名。此正则表达式过滤虚拟电子邮件地址,例如asdf@adsf.adsf添加新的顶级域后,将需要对其进行更新

[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

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

重点矿


84
注意:编写代码时,“ 今天的实际使用情况”可能是200x时有效的。该代码可能保持在超出特定年份使用。(如果我每个人都得到一角钱,“ Meh,除了那些必须修复的特定字母之外,没有人会使用4个字母的TLD,这样我就可以
垄断

7
对于RFC 2822的实际实现,应该对结尾进行一些修改,以防止单个char域扩展。/ [a-z0-9!#$%&'* + \ / =?^ _ {|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_{|}〜-] +)* @(?:[a-z0-9](?:[a-z0-9 -] * [a-z0-9])?\。)+ [a-z0-9] [a-z0-9-] * [a-z0-9] /
Farrell将在2012年

5
此外,第一部分应该是(:[AZ用大写字母A,以避免假阴性当用户大写他们的电子邮件地址?
唐滚动

9
@DonRolling不要那样做。那不仅意味着“ A到Z,a到z”,还意味着“ [\] ^ _`”,因为它们 “ Z”和“ a”之间。使用\w或更好,在执行任何操作之前,请小写电子邮件地址,因为无论如何都是如此。
kirb

5
“添加新的顶级域后,您将需要对其进行更新。” 好吧,现在就这么多了-有超过1500个公认的TLD。
内森·奥斯曼

377

哇,这里有很多复杂性。如果您只想捕捉最明显的语法错误,我将执行以下操作:

^\S+@\S+$

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


70
+1是发送电子邮件并查看会发生什么,这是验证电子邮件地址的唯一真正可靠的方法,除了做一个简单的正则表达式匹配之外,无需做其他任何事情。
kommradHomer

20
您仍然可以使其简单,但要多做一些操作以确保其具有“。”。@之后的某个位置,后面仅跟随数字或数字,因此诸如me @ here,me @ here @和me @ herecom之类的内容无效... ^ \ S + @ \ S + [\。] [0-9a-z ] + $
蒂姆·富兰克林

14
我认为电子邮件地址可以包含空格。最好使用.+@.+
山姆

11
/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð") true
gtournie 2014年

110
@gtournie没人在乎。没有人会意外地将其输入到电子邮件字段中,而所有前端验证都是为了:防止人们在电子邮件字段中意外输入错误的信息(例如姓名)。
meagar

330

在决定使用正则表达式验证电子邮件时,您需要了解一些内容: 这可能不是一个好主意。一旦您对此有所了解,就有许多实现可以使您半途而废,本文对它们进行了很好的总结。

简而言之,唯一可以绝对肯定地确定用户输入的实际上是电子邮件的唯一方法是实际发送电子邮件并查看发生了什么。除此之外,所有这些只是猜测。


112
-1为什么我要花时间来验证一个甚至没有通过regex控件的电子邮件地址?
kommradHomer

63
@kommradHomer-“正则表达式无效”地址几乎总是有效的,因为您用来验证电子邮件地址的任何正则表达式几乎肯定是错误的,并且会排除有效的电子邮件地址。电子邮件地址name_part@domain_part和几乎任何东西,包括@,是在name_part有效; 该地址foo@bar@machine.subdomain.example.museum是合法的,尽管必须将其转义为foo\@bar@machine....。一旦电子邮件到达域(例如“ example.com”),该域就可以“本地”路由邮件,因此可以存在“奇怪的”用户名和主机名。
斯蒂芬·P

6
stackoverflow.com/a/1373724/69697中的voyager答案中的第二个正则表达式非常实用,应该几乎没有假阴性。我在这里同意@kommradHomer,如果不需要,为什么还要发送电子邮件?我可以理解反正的不喜欢正则表达式的反感,并希望保持代码简单,但这是几行代码,可以通过立即清除绝对无效的项来为您的服务器节省很多麻烦。正则表达式本身无济于事,但可以很好地补充服务器端验证。
Ben Regenspan

6
@dmur我承认“几乎总是有效”可能是夸大其词,但是我(完全有效且有效)的电子邮件地址经常被网站拒绝,原因仅在于我拥有.us域名或因为我+在左边使用了的@-许多地方已修正这些令人震惊的错误,但当地部分(左@)即可任何域名所有者希望。-> "foo@bar.com"@example.com <-是有效的电子邮件地址。
斯蒂芬·P

8
@kommradHomer“正则表达式无效的地址是%100无效的地址。” 对不起...对不起?您知道我被告知foo+bar@gmail.com无效时,有多少次实际上是有效的吗?您的逻辑极有缺陷。我已经用电子邮件提交了表单,例如:thisisafakeemailbutitpasspassyourstupidregexcheck@regexchecksareretarded.com你猜怎么着?可以通过REGEX检查...但是它不是有效的电子邮件(尽管从技术上讲是正确的,但是我保证您不存在该邮件...但还是挠了他的下巴)。正如许多人所说,这是一个
糟糕的

211

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

<form><input type="email" placeholder="me@example.com" required>
    <input type="submit">
</form>

jsFiddle链接

根据HTML5规范

一个有效的电子邮件地址是该相匹配的字符串email生产下列ABNF中,对于该字符集是Unicode。

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 的故意违反,它定义了同时太严格(在“ @”字符之前),太模糊(在“ @”字符之后)和太松散(允许注释)的电子邮件地址语法。 ,空白字符和引号引起的字符串(大多数用户不熟悉的方式)在此处具有实际用途。

以下与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])?)*$/

29
这样做很好,但是问题在于它必须位于form标签内并由submit输入提交,并不是每个人都可以这样做。另外,您不能真正设置错误消息的样式。
杰森

3
我在下面添加了一个答案,使您摆脱了表单并提交。但是,是的,浏览器通常也只应用一些合理性检查,而不是完整的RFC 822验证。
Boldewyn 2012年

8
@ br1:这并不仅仅因为不存在“ a”顶级域而无效。如果您的Intranet可以解析某些IP,该怎么办?
飞羊

7
HTML5电子邮件字段类型接受诸如user @ email之类的电子邮件
2015年

1
注意@Puce的注释:HTML 5电子邮件输入被接受,user@email而PHP filter_var则不接受。这可能会引起问题。
19

136

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

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

它允许以下格式:

1. prettyandsimple@example.com
2. very.common@example.com
3.一次性.style.email.with + symbol @ example.com
4. other.email-with-dash@example.com
9. #!$%&'*+-/=?^_`{}|~@example.org
6.“()[]:,; @ \\\”!#$%&'* +-/ =?^ _`{} | 〜.a“ @ example.org
7.“” @ example.org(引号之间的空格)
8.üñîçøðé​​@example.com(本地使用Unicode字符)
9.üñîçøðé​​@üñîçøðé​​.com(域部分中的Unicode字符)
10.Pelé@example.com(拉丁语)
11.δοκιμή@παράδειγμα.δοκιμή(希腊语)
12.我买@屋企。香港(中文)
13.甲斐@黒川。日本(日语)
14.чебурашка@ящик-с-апельсинами.рф(西里尔文)

它显然用途广泛,并允许使用所有重要的国际字符,同时仍强制执行基本的any @@ thing.anything格式。它会阻止RFC在技术上允许的空间,但是它们很少见,我很乐意这样做。


9
这正是我在做的。所有这些“复杂”的答案都会产生问题:它们要么不允许使用弱代码IDN,要么使用一组固定的TLD,或者不必要地限制用户不要在其电子邮件前缀中使用[@ çµ.ö之类的字符(@之前)或域名。出于安全原因,前端的JavaScript(不适用于原因的后端)不足以进行验证。那么,为什么不帮助用户避免基本的错字呢?基本的错别字是:忘记TLD或用户前缀(@之前)或域部分或错误键入@.(反之亦然)。当然,我们必须在服务器端更加严格。
Hafenkranich

由于某些奇怪的原因username@domain.com,这种模式不起作用
einstein 2016年

2
根据您的正则表达式,“ _.............. kamal@gmail.com”有效,不应为有效!
卡马尔·纳扬

1
如果您想修改此解决方案,则可以使用下面的正则表达式示例:regex101.com/r/AzzGQU/2
ryanm

7
此正则表达式是正确的。如果有人像这样输入他们的电子邮件,a@b@c@d.x.y.@.z那么也许他们应该度过一段糟糕的时光?:D
corysimmons

94

在现代浏览器中,您可以使用纯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的准系统验证相结合,它将您从正则表达式大屠杀中解放出来,并且不会在旧的浏览器上出现问题。


4
解决这个问题是一个聪明的主意,但是它不起作用,因为浏览器的验证也很糟糕。例如,可以.@atrue在当前版本的Chrome,Firefox和Safari中一样进行验证。
汉克

13
@HenryJackson不幸的是,在这种情况下,是的。这是因为根据RFC,这是一个有效的电子邮件地址(请考虑Intranet)。如果浏览器验证范围太窄并产生假阴性,就会被烤死。
Boldewyn

3
更新以包含功能检测和正常降级功能,现在它不会在新浏览器上中断,而是使用您喜欢的任何正则表达式。
罗尼2015年

不错的解决方案。遗憾的是,这仅适用于HTML5 +。
爱德华·奥拉米桑

3
到目前为止,这是对原始问题的最佳解决方案。是的,它使用HTML5,但是无论如何,大多数需要这种准确性的应用程序肯定已经以其他某种方式依赖HTML5,所以要点。在没有让他们进行任何验证的情况下,我们不可能确定某人的电子邮件是否有效,因此我们真的不应该花费太多时间或精力来验证它。快速检查任何明显的语法或尝试的顽皮是我们应该付出的全部努力。
伍迪·佩恩

69

这是正确的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);
}

IDN地址未通过验证(info@üpöü.com)
DAH,

66

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)>)$

1
@Kato:它使用了一些不兼容的扩展名,包括(?>停止回溯并(?<angle><)…(?(angle)>)避免提供冗长的|
Ry-

60

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

email.indexOf("@") > 0

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

要进行测试,请发送验证消息。


3
如果会有多个“ @”符号怎么办?其他受限制的符号?此验证不可信任...
eatmypants 2015年

56

使用单行正则表达式无法正确实现符合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:在last之前应该有一些东西(电子邮件用户名)@

  • str.indexOf('@@') == -1@@地址中不应包含任何地址。即使@显示为电子邮件用户名中的最后一个字符,也必须将其引号引起来,使"之介于该地址@@地址中的最后一个字符之间。

  • lastDotPos > 2:最后一个点之前至少应包含三个字符,例如a@b.com

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


这个fn看起来不错,但是它比顶部答案中的正则表达式好吗?
Atul Goyal

4
我对此表示怀疑。我仅使用它来检查字符串是否看起来像电子邮件,并将详细信息留给服务器端代码。
米洛什RASIC

它可以确认OK这样的任何字符串,例如'aaaa',即不包含'@'和'。
纳季(Nennady Shumakher)

1
不应该这样 如果找不到索引指针,lastIndexOf()应该返回-1。
米洛什·拉希奇(MilošRašić)2012年

“即使@显示为电子邮件用户名中的最后一个字符,也必须将其引号引起"来,使@@位于该地址和地址中的最后一个字符之间。” "@@"@example.com
Ry-

47

这是从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;}

7
这会过滤掉受欢迎的域名.museum.travel域名(由于之后限制为4个字符.
bobobobo

4
将{2,4}更改为{2,6}不会有问题
Anton N

11
@安东·N:它也有大约成千上万的其他问题。最终{2,4}值只是一个有用的指标(如“当您看到错误时,其他错误很可能会出现”)。在最基本的一个就是缺乏+在当地的部分; 此注释框太小,无法指出上面提交的所有错误。
Piskvor在

37
你为什么不能做return filter.test(email.value);呢?
MT。

3
@AntonN:现在我们有10个以上的字符TLD(xn--clchc0ea0b2g2a9gcd)。还是没有问题?
Piskvor在

42

做这个:

[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,是必须遵循的标准所有电子邮件地址。而且我不确定您为什么要打扰“简单”的东西……无论如何您都要复制并粘贴它;)

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

[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('some.body@domain.co.uk') );

注意
从技术上讲,某些电子邮件可以在@符号前的部分中加上引号,并在引号内包含转义符(因此,您的电子邮件用户可能很讨厌,@并且"..."只要包含在引号中,就可以包含和)。Nobody做到这一点!已经过时了。但是,它包含在真正的RFC 2822标准中,在此省略。

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


@Kondal javascript代码不区分大小写,因为/i正则表达式末尾的标志。我提到了这样一个事实,即它必须是不区分大小写的比较,但我会更清楚地说明这一点。
瑞安·泰勒

为我而魅力
-Alex

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,})$/

通过Wikipedia电子邮件地址中的示例。

您可以在这里看到结果。

在此处输入图片说明


这似乎是一个不错的解决方案,它也适用于新的TLD和1封电子邮件
Mark Hughes

为什么john..doe@example.com不正确?这是一个有效的特殊情况。
Valerio Bozz

24

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

现在,由于您只能涵盖90%的情况,因此请编写以下内容:

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

您可以对其进行优化。例如,“ aaa @”有效。但总的来说,您的主旨是。并且不要被带走……一个简单的90%解决方案要比不起作用的100%解决方案好。

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


15
这允许输入这么多无效的电子邮件地址,这是无用的建议。
cazlab 2012年

3
完全不必调试。该线程中有许多很好的示例,它们的有效性比“其中是否包含'@'更有效。您的示例允许将“ u @”视为有效的电子邮件地址。至少可以评估是否存在域或某些可能是一个域你的是我会称之为一个例子,我不知道为什么你是保卫它,因为它是迄今为止在该线程的最低额定答案。“积极懒编码。”
cazlab

3
@cazlab也许您是对的。毕竟我被否决了。与您不同的是,我不认为上面的任何代码都易于调试代码段。如果需要,至少可以改进我的“积极懒惰”方法。
2012年

3
这与使用正则表达式有何不同?(.+)@(.*)做同样的事情,并且更短。
snostorm

4
+1-如果目的是确保用户至少尝试输入电子邮件地址,请检查是否可以确定该电子邮件地址绝对不是电子邮件地址。很好的解决方案。一个很好的例子是,如果您想要一个人的用户名作为电子邮件地址。如果用户键入“ sexy_chick_23”,则可以使用此正则表达式提示他们是否需要电子邮件。如果键入的内容看起来像一封电子邮件,但看起来却并非如此,则用户将永远不会收到“确认”电子邮件,并且注册过程也将永远不会得到验证。
克里斯·杜特罗

23

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

<input type="email"/>

无需编写任何函数进行验证。


4
IE <10不支持此功能,Android自己的浏览器也不支持。
Frank Conijn 2014年

7
正在投票。IE <10已死。
Michael Scheper

19

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

一些需要改进的地方:

代替new RegExp,只需尝试regexp像这样写出:

if (reg.test(/@/))

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


19

这是节点验证器的操作方式:

/^(?:[\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])\]))$/

14

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

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
}

1
abc@xyz是您的正则表达式无法识别的完全有效的电子邮件。
Toto

3
不,这不对。正确的电子邮件模式为something@something.something,abc @ xyz与该模式不匹配。因此,它不是有效地址。
Orchid


5
您是维基百科页面吗?TLD是有效的主机名。所以abc@tld是一个有效的电子邮件地址。
Toto 2013年

2
验证电子邮件地址的唯一方法是发送电子邮件,然后等待响应。除此之外,这里是一个URL,您可以在其中测试您的地址是否符合RFC822:mythic-beasts.com/~pdw/cgi-bin/emailvalidate。您可以看到abc @ xyz是RFC822的有效地址。
Toto 2013年

14

正则表达式更新2018!尝试这个

let val = 'email@domain.com';
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');
}

打字稿版本已完成

//
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


这对于标准的email@domain.com来说失败了
ricks

1
@RickS这根本不是真的。请再次检查
马里莫

13

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

对此问题的几乎所有答案都建议使用Regex来验证电子邮件地址。我认为Regex仅适用于基本验证。看来,电子邮件地址的检查验证实际上是两个独立的问题:

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

例如,尽管地址example@example.ccc将通过正则表达式,但它不是有效的电子邮件,因为ccc它不是IANA的顶级域。

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


13

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

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

我在RFC5322中看不到您的正则表达式:tools.ietf.org/html/rfc5322- 有错误吗?
卡米尔·基列夫斯基(KamilKiełczewski)

“有史以来最好的正则表达式”?这里可能有某种解释吗?
connectyourcharger

为什么您说这是所有方法中最好的解决方案,请您多说明一点吗?
nancoder

我不记得为什么我写了“有史以来最好的正则表达式”。抱歉,打扰您了。
Prabhat Kasera,

12

这是有关使用正则表达式验证电子邮件地址的很好的讨论。“ 比较验证正则表达式的电子邮件地址

这是当前与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

9
-1白名单有很多不足之处-特别是您错过了.jobs。此外,还有实时的IDN(我承认,其中大部分仅在您上任后才正式批准-例如.中國在2010年6月;但是大多数已经使用了多年)。
Piskvor在2011年

2
-1不使用恒定的顶级域。总是(例如会有2013年)可以添加新的tld。
美穗

已确认有100个新的TLD。该答案无效,切勿使用。
Dean Meehan

对。我已经在2011年说过了,我再说一遍:随着更多TLD的批准,“特殊”域名的白名单只会随着时间的推移而恶化。超过100个完全有效的TLD与上述白名单
不符

是2015年。您的表达不切实际。您应该把这个答案记下来,但是您可能很忙于修复放置此表达式的所有页面。对?
Eric Leroy 2015年


12

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('youremail@yourdomain.com')){ console.log('This is email is valid'); }

10
您不需要== true在示例中使用。
卢克·阿德顿

11

我对正则表达式的了解不是很好。这就是为什么我先使用简单的正则表达式检查常规语法,然后再使用其他函数检查更具体的选项的原因。这可能不是最佳的技术解决方案,但是通过这种方式,我可以变得更加灵活和快捷。

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

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('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true

10
<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>

<script language="JavaScript1.2">
    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)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>

也许您添加了解释或说明吗?我认为您真的不需要显示任何HTML;所有人关心的是javascript和regex。如果您将答案简化为仅针对jacscript的内容,并添加一些内容说明,我将给您点赞。
bgmCoder

9

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

  • email@example.com 有效的电子邮件

  • firstname.lastname@example.com 电子邮件在地址字段中包含点

  • email@subdomain.example.com 电子邮件包含带子域的点

  • firstname+lastname@example.com 加号被认为是有效字符

  • email@192.0.2.123 域是有效的IP地址

  • email@[192.0.2.123] IP地址周围的方括号被认为是有效的

  • “email”@example.com 电子邮件周围的报价被认为是有效的

  • 1234567890@example.com 地址中的数字有效

  • email@domain-one.example 域名中的破折号有效

  • _______@example.com 地址字段中的下划线有效

  • email@example.name .name 有效的顶级域名

  • email@example.co.jp顶级域名中的点也被视为有效(co.jp此处以示例为例)

  • firstname-lastname@example.com 地址字段中的破折号有效

开始了 :

http://regexr.com/3f07j

或正则表达式:

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

8

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

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

如果存在缺陷,我会在此处发布-尽管它始终非常适合我的需求。


1
电子邮件的名称部分不允许使用+。
Paul Go
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.