当前位置: 首页 > 知识库问答 >
问题:

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

傅星光
2023-03-14

我需要一个正则表达式,将接受格式良好的电子邮件在几种格式(见下文),将在一个逗号分隔的列表中输入。我有基本的电子邮件地址验证正则表达式,

^[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})(,|$) 

它可以处理测试用例A和B,但不能处理其他。我也试过了

^(\<)?[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})(\>)?(,|$)

它能够处理A、B和C,但只验证了每个测试用例D和E中的第一个电子邮件地址。我甚至还没有开始测试格式3的正则表达式。

tl;dr需要一个正则表达式来验证电子邮件地址1、2和3。

测试正则表达式的好网站:在线Javascript正则表达式测试仪

数据

测试用例A。nora@example.com
B。nora@example.com, fred@example.com
C.<代码>

电子邮件地址格式
1.xyz@example.com
2.

我将其标记为可能的重复:

验证JavaScript中的电子邮件地址?

反过来,这似乎是:

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

这两篇文章都对正则表达式作为电子邮件验证的有效性进行了大量讨论。然而,排名靠前的正则表达式似乎并没有达到我想要的效果,所以我认为这个问题还没有解决。


共有3个答案

胡承载
2023-03-14

这个validateEmail函数将检查电子邮件地址的基本语法(xyz@example.com)。包含的if将检查替代格式(

var emailList = "abc@example.com,<lmn@example.com>,'xyz' <xyz@example.com>,invalidExample.com,Nope@example.com>,'Still93e-=48%5922=2 Good' <xyz@example.com>";
var emails = emailList.split(",");

//Loop through the array of emails
for (var i = 0; i < emails.length; i++) {
    var isValid = 1;
    var cur = emails[i];

    // If it has a < or a >,
    if( cur.indexOf("<") > -1 || cur.indexOf(">") > -1 ){
        // Set it invalid
        isValid = 0;
        // But if it has both < and >
        if( cur.indexOf("<") > -1 && cur.indexOf(">") > -1 ){
            //Set it valid and set the cur email to the content between < and >
            isValid = 1;
            cur = cur.substr(cur.indexOf("<")+1, ( cur.indexOf(">") - cur.indexOf("<") - 1 ));
        }
    }
    //Run the validate function
    if ( !validateEmail(cur) )
        isValid = 0;

    // Output your results. valid = 1, not valid = 0
    alert("Orig: "+emails[i] +"\nStripped: "+cur+"\nIs Valid: "+isValid);

}

function validateEmail(curEmail){
    var emailValid = /.*\@.*\..*$/g;
    return (curEmail.test(emailValid));
}

jsFiddle

俞衡虑
2023-03-14
匿名用户

首先将逗号分隔的列表拆分为一个数组,然后分别验证数组的每个成员,这样会更简单。这将使正则表达式更易于编写(以及读取和维护),还使您能够向输入列表的用户提供特定反馈(“第三个电子邮件地址无效”)。

所以假设你用分叉来做

var bits = csv.split(',');

遍历位数组

for (var i = 0; i < bits.length; ++i) {
  if (!validateEmail(bits[i])) {
    alert("Email #" + (i+1) + " is bogus");
  }
}

然后对于正则表达式,类似这样的内容将捕获2和3

(\"[a-z0-9\s]+\"\s+)?\<[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})\>

您可以使用更简单的方法捕获简单的电子邮件地址,而无需<代码>

如果测试,单个正则表达式不一定会比两个运行得更快,尤其是如果您通过将更可能的放在首位来短路。它也更难阅读和维护。最后,这非常棘手,因为您需要前瞻:最终的

所以我的0.02美元=不值得。只需做两个正则表达式。

裴彦
2023-03-14

提供的链接或答案都不是这个问题的最佳答案。以下是解决问题的方法:

/*
* regex checks: must start with the beginning of a word or a left caret
* must end with either the end of a word or a right caret
* can handle example.example.com as possible domain
* email username can have + - _ and .
* not case sensitive
*/
var EMAIL_REGEX = /(\<|^)[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})(\>|$)/i;  
var emails = emailList.trim().split(',');  
var validEmails = [];  
var invalidEmails = [];  

for (var i = 0; i < emails.length; i++) {  
    var current = emails[i].trim();
    if(current !== "") {
        //if something matching the regex can be found in the string
        if(current.search(EMAIL_REGEX) !== -1) {
            //check if it has either a front or back bracket
            if(current.indexOf("<") > -1 || current.indexOf(">") > -1) {
                //if it has both, find the email address in the string
                if(current.indexOf("<") > -1 && current.indexOf(">") > -1) {
                    current = current.substr(current.indexOf("<")+1, current.indexOf(">")-current.indexOf("<") -1);
                } 
            } 
        }
        if(EMAIL_REGEX.test(current)) {
            validEmails.push(current);
        } else {
            invalidEmails.push(current);
        }
    }               
}
 类似资料:
  • 问题内容: 有人可以向我解释这个Java Regex吗? 此正则表达式用于验证 电子邮件地址 。 问题答案: 如今,验证电子邮件地址被认为是一种不好的做法(停止使用regex验证电子邮件地址),尤其是使用问题中的表达式时。例如,这是一个更完整的表达式。 至于此表达式,我们将其分为几部分: 匹配字符串的开头 匹配列表中的至少一个字符 非捕获(请参阅backreference)组,可以重复0..n次,

  • 问题内容: 多年来,我慢慢地开发了一个正则表达式,假设它们不使用IP地址作为服务器部件,则可以正确验证MOST电子邮件地址。 我在几个PHP程序中使用了它,并且大多数时候都可以使用。但是,有时会遇到某个使用它的站点出现问题的人与我联系,最终我不得不进行一些调整(最近我意识到我不允许使用4个字符的TLD)。 您已经或看到的用于验证电子邮件的最佳正则表达式是什么? 我已经看到了几种使用使用几个较短表达

  • 本文向大家介绍js正则表达式验证邮件地址,包括了js正则表达式验证邮件地址的使用技巧和注意事项,需要的朋友参考一下 我们最经常遇到的验证,就是电子邮件地址验证。网站上常见。各种网页脚本也都常用“正则表达式”(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法。有的还能分解出用户名和域名。现在用JavaScript语言实现一下电子邮件地址验证程序,用的是JavaSc

  • 在搜索用于电子邮件地址验证的正则表达式时,我遇到了这个页面:http://www.regular-expressions.info/email.html.我无法理解它。 它表示:\b[A-Z0-9._%-]@(?[A-Z0-9-]。[A-Z]{2,4}\b将匹配john@server.department.company.com但不是john@aol...com. 你能详细解释一下(?:[A-Z0

  • 需要验证电子邮件地址与单个域级别或多级域。(实际上域级别<=4) null null 在线正则表达式:https://regex101.com/r/7sxs1z/1

  • 问题内容: 我正在使用以下正则表达式 它接受#@#.com作为有效电子邮件。我应该使用什么模式? 问题答案: 您应该使用apache- commons电子邮件验证程序。您可以从此处获取jar文件。 这是一个简单的用法示例: