我需要一个正则表达式,它将接受几种格式的格式良好的电子邮件(见下文),这些格式将以逗号分隔的列表输入。我有基本的电子邮件地址 验证正则表达式,
^[\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 的正则表达式。
测试正则表达式的好网站: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>
我将此标记为可能的副本:
Validate email address in JavaScript?
反过来看起来像是重复:
Using a regular expression to validate an email address
这两个都包含很多关于正则表达式作为电子邮件验证的有效性的讨论。然而,提供的最高投票的正则表达似乎没有做我想要的,所以我不认为这已经回答了。
答案 0 :(得分:1)
首先将逗号分隔列表拆分为数组并单独验证数组的每个成员会更简单。这将使正则表达式更容易编写(以及读取和维护),并且还使您能够向输入列表的用户提供特定的反馈(“第3个电子邮件地址无效”)。
所以假设你用分裂
做到了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
更可能的第一个来短路>
。它的阅读和维护也比较困难。最后,这是非常棘手的,因为你需要一个前瞻:如果电子邮件地址前面的字符串在电子邮件的第一个字符之前包含<
,则最终{{1}}才可以。
所以我的0.02美元=不值得。只做两个正则表达式。
答案 1 :(得分:1)
此validateEmail函数将检查电子邮件地址的基本语法(xyz@example.com
)。
包含的if
将检查备用格式(<xyz@example.com>, 'xyz' <xyz@example.com>
)并仅验证实际的电子邮件部分。
只有&lt;的项目或者&gt;被视为格式不佳(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));
}
答案 2 :(得分:1)
所提供的链接或答案都不是此问题的最佳答案。这是解决它的原因:
/*
* 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);
}
}
}
答案 3 :(得分: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>'));