Как добавить в проверку email конкретные tld?

Есть регулярное выражение, которое проверяет email:

email: (value) => {
    const pattern = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return pattern.test(value) || "Invalid e-mail.";
},

Что необходимо добавить в него/ изменить в нем, чтобы доступные вводимые имейлы могли заканчиваться только на 2 возможных tld: com или ukr?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Что нужно знать в таких случаях, так это где нужно ввести изменение. Для этого нужно понять, как работает регулярное выражение, выявить его составные компоненты и ограничить ту часть, которая нужна.

На сайте regex101.com в режиме PCRE можно включить опцию extended (флаг x) и разбить регулярное выражение по строкам, вот что у меня получилось:

^
(
  [^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*|".+"
)
@
(
  \[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}]|([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}
)
$

См. пример на regex101. Да, я удалил ненужные скобки, где они ничего не группировали.

Сразу становится ясно, что [^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*|".+" нас не интересует, эта часть отвечает за имя пользователя. Смотрим, что стоит за @. А там \[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}]|([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}, чередование двух шаблонов.

\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}] находит IP в квадратных скобках, и это снова не наш шаблон. Зато ([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,} - то, что нужно.

Замените [a-zA-Z]{2,} на (?:ukr|com), и дело с концом:

^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@(\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}]|([a-zA-Z\-0-9]+\.)+(?:com|ukr))$

См. пример регулярного выражения.

→ Ссылка