名称和姓氏的电子邮件正则表达式验证

Email Regex Validation for Name and Surname

我正在尝试验证一些电子邮件地址。

电子邮件地址可以采用以下格式:-

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),以便它也可以验证多个名字和姓氏?

感谢您的帮助和时间

这个正则表达式可以做到(包括变音符号):

/^(([().!#$%&'*+\/=?^_`{|}~\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 &lt;test@test.com&gt;</div>
<div>Name, Surname &lt;test@test.com&gt;</div>
<div>Name 北京市 Surname surname2 Surname3 &lt;test@test.com&gt;</div>
<div>Name (name 2), Surname-surname2 &lt;test@test.com&gt;</div>
<div>Name &lt;test@test.com&gt;</div>
<div>test @test.com</div>
<div>isthis3avalid test &lt;test@test&gt;</div>
</textarea>

我试图通过尽可能使用 \w 来简化匹配,并使用 À-ÿ 来匹配所有重音字符。它可能会匹配一些你可能不会考虑的字符 "valid",但你为什么要成为那个的绝对判断者......或者如果你认为你需要,那么你可以用列表替换它所有你会接受的。

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");
}