1

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

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

它可以处理测试用例AB,但不能处理其他测试用例。我也试过

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

它能够处理ABC,但只验证了每个测试用例DE中的第一个电子邮件地址。我什至还没有测试格式3的正则表达式。

tl;dr需要一个正则表达式来验证电子邮件地址123

测试正则表达式的好网站:Online Javascript Regex Tester

数据

测试用例
A. nora@example.com
B. nora@example.com, fred@example.com
C. <nora@example.com>, fred@example.com
D. <nora@example.com>, <fred@example.com>
E. fred@example.com,<nora@example.com>

电子邮件地址格式
1. xyz@example.com
2. <xyz@example.com>
3. “xyz”<xyz@example.com>

编辑

我将此标记为可能的重复项:

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

反过来,这似乎是以下内容的副本:

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

两者都包含很多关于正则表达式作为电子邮件验证的有效性的讨论。但是,提供的投票最多的正则表达式似乎并没有完全符合我的要求,所以我认为这还没有回答。

4

4 回答 4

2

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

/*
* 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);
        }
    }               
}
于 2012-06-20T18:02:28.703 回答
1

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

因此,假设您通过拆分做到了这一点

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

遍历bits数组

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,})\>

您可以使用更简单的方法来捕获简单的电子邮件地址,而无需在<其前面加上引号或名称。

单个正则表达式的运行速度不一定比两个测试快,特别是如果您通过将最有可能的一个放在第一位来if短路。or它也更难阅读和维护。最后,它特别棘手,因为您需要前瞻:>只有在电子邮件地址前面的字符串包含电子邮件<第一个字符之前的右侧时,最后才可以。

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

于 2012-06-20T00:49:59.170 回答
1

此 validateEmail 函数将检查电子邮件地址 ( xyz@example.com) 的基本语法。包含if的 s 将检查替代格式 ( <xyz@example.com>, 'xyz' <xyz@example.com>) 并仅验证实际的电子邮件部分。仅包含 < 或 > 的项目因格式不佳(Nope@example.com>)而被视为无效,与任何缺少所需基本结构的电子邮件相同(invalidExample.com)。

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

于 2012-06-20T02:01:41.837 回答
0

这样的事情会有帮助吗?

我已经测试了2.3.,它检测到了这两种模式。

var isEmail_re       = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;

function isEmail (s) {
   return String(s).search (isEmail_re) != -1;
}

alert(isEmail ('"xyz"<xyz@example.com>'));

http://jsfiddle.net/epinapala/BfKrR/

于 2012-06-20T00:47:02.490 回答