Email Regex Validation для имени и фамилии - PullRequest
2 голосов
/ 10 января 2020

Я пытаюсь проверить некоторые адреса электронной почты.

Адреса электронной почты могут быть в следующем формате: -

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 сценария ios, однако я застрял, чтобы проверить последний сценарий.

До сих пор я построил 4 регулярных выражения, каждое для проверки сценария.

Итак, у меня есть следующие регулярные выражения для сценария ios

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), чтобы оно также могло проверять несколько имен и фамилий?

Спасибо за помощь и время

Ответы [ 2 ]

1 голос
/ 10 января 2020

Это регулярное выражение сделает это (включая диакритические знаки):

/^(([().!#$%&'*+\/=?^_`{|}~\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>
0 голосов
/ 10 января 2020

Я попытался упростить сопоставление, максимально используя \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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...