我正在尝试验证一些电子邮件地址。
电子邮件地址可采用以下格式:-
1)test@test.com
2)<test@test.com>
3) Name Surmame <test@test.com>
4) Name, Surname <test@test.com>
5) Name(multiple) Surname(multiple) <test@test.com>
6) Name(multiple), Surname(multiple) <test@test.com>到目前为止,我已经成功地验证了前4个场景,但是我坚持验证最后一个场景。
到目前为止,我已经构造了4个正则表达式,每个正则表达式都用于测试场景。
因此,对于这些场景,我有以下正则表达式
1) /^[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])?)*$/
2) /^<[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])?>)*$/
3) /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+[\n# $&:\n\t]+[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+[\n# $&:\n\t]+<[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])?>)*$/
4) /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+[\n# $&:\n\t]+[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+[\n# $&:\n\t]+<[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])?>)*$/是否可以操作最后一个正则表达式(4),使其也可以验证多个姓名和姓氏?
感谢您的帮助和时间
发布于 2020-01-10 22:19:56
此正则表达式可以做到这一点(包括变音符号):
/^(([().!#$%&'*+\/=?^_`{|}~\u00BF-\u1FFF\u2C00-\uD7FF\w-]+[,\n#\s$&:\n\t]+){2,}){0,}(?:<){0,1}[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]))(?:>){0,1}$/igm以下行检查名称,包括发音符号\u00BF-\u1FFF\u2C00-\uD7FF\w- (而不是电子邮件)。它被包装在一个捕获组中,该捕获组将评估是否有任何名称。如果有名称,第二个捕获组将检查是否至少有两个{2,}。它是一个压缩版本,因为我们不需要区分名字和姓氏。
<>被封装在非捕获组中,应该出现零次或一次。
/(([().!#$%&'*+\/=?^_`{|}~\u00BF-\u1FFF\u2C00-\uD7FF\w-]+[,\n#\s$&:\n\t]+){2,}){0,}/
const regEx = /^(([().!#$%&'*+\/=?^_`{|}~\u00BF-\u1FFF\u2C00-\uD7FF\w-]+[,\n#\s$&:\n\t]+){2,}){0,}(?:<){0,1}[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]))(?:>){0,1}$/ig;
const emails = document.querySelectorAll("div");
emails.forEach(element => {
if (element.textContent.match(regEx))
{
element.classList.add("match");
}
});div.match {
color: #ff0000;
}<div>test@test.com</div>
<div><test@test.com></div>
<div>Näme Surmame <test@test.com></div>
<div>Name, Surname <test@test.com></div>
<div>Name 北京市 Surname surname2 Surname3 <test@test.com></div>
<div>Name (name 2), Surname-surname2 <test@test.com></div>
<div>Name <test@test.com></div>
<div>test @test.com</div>
<div>isthis3avalid test <test@test></div>
</textarea>
发布于 2020-01-10 22:33:35
为了简化匹配,我尽可能多地使用\w,并使用À-ÿ来匹配所有重音字符。它可能会匹配一些你可能认为不“有效”的字符,但为什么你要成为这一点的绝对判断呢……或者,如果您认为您需要这样做,那么您可以将其替换为您可以接受的所有列表。
var strings = [
"test@test.com",
"<test@test.com>",
"Name Surname <test@test.com>",
"Náme Sùrname <test@test.com>",
"Name, Surname <test@test.com>",
"Namë, Surnáme <test@test.com>",
"Name and more Surname and more <test@test.com>",
"Namë or2 móre Surname and more <test@test.com>",
"Name or! more, Surname and more <test@test.com>",
"Ñame or. möre, Surname ánd more <test@test.com>"
];
var regexes = [
/^[\w]+@[\w]+(\.[\w]+)+$/,
/^<[\w]+@[\w]+(\.[\w]+)+>$/,
/^[\wÀ-ÿ.!#$%&'*+/=?^_`{|}~-]+(,? ?[\wÀ-ÿ.!#$%&'*+/=?^_`{|}~-]+)* <[\w]+@[\w]+(\.[\w]+)+>$/
];
// each string should match at least 1 regex
for (var i = 0; i < strings.length; i++) {
var allowed = false;
for (var j = 0; j < regexes.length && !allowed; j++) {
allowed = strings[i].match(regexes[j]);
if (allowed)
console.log("String " + i + " is allowed by regex " + j);
}
if (!allowed)
console.log("String " + i + " is not allowed by any regex");
}
https://stackoverflow.com/questions/59682603
复制相似问题