样式电子邮件地址验证

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

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

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

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

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

TL;博士需要一个正则表达式将验证的电子邮件地址1,2,3。

好的网站来测试你的正则表达式:在线Javascript正则表达式测试器

数据

测试用例
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中验证电子邮件地址?

而这反过来似乎是以下内容的重复:

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

这两者都包含了关于正则表达式作为电子邮件验证的有效性的很多讨论。 然而,提供的排名前列的正则表达式似乎并没有达到我想要的水平,所以我不认为这个答案是。


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

所以假设你做了分裂

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-9s]+"s+)?<[wd._%+-]+@(?:[wd-]+.)+(w{2,})>

而且你可以使用更简单的捕获简单的电子邮件地址,而不用<或前面的引号中的名称。

if测试的话,单个正则表达式的运行速度不会快于两个,特别是如果您将这个or更多的可能性放在第一位。 阅读和维护也很困难。 最后,这是非常棘手的,因为你需要一个前瞻:如果电子邮件地址前面的字符串包含一个<正好在电子邮件的第一个字符之前,那么最后的>就没有问题。

所以我的$ 0.02 =不值得。 只要做两个正则表达式。


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


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

/*
* 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 = /(<|^)[wd._%+-]+@(?:[wd-]+.)+(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);
        }
    }               
}
链接地址: http://www.djcxy.com/p/92593.html

上一篇: style email address validation

下一篇: Why output of my Javascript regex is inconsistent?