e-mail валидатор
Посмотрев на валидаторы в сети, понял, что нужно пилить свой...
Как обычно, простой, короткий, надёжный:
bool ValidEmail(string email) => new Regex(^[\w.-]+@\w+\.[a-z]+(\.[a-z]+)*$, RegexOptions.IgnoreCase).IsMatch(email);
И да, кто-то скажет, что тут запрет на кавычки и собаку, которые по стандарту очень даже могут быть дополнительно в e-mail и этому кому-то Я скажу, что ни GMail, ни Яндекс, ни, прости господи, MailRu не дают выдумывать почты подобные этим: myn'a'm@e@site.com, поэтому валидатор, которым делюсь с Вами можете спокойно использовать 👍
email
validator
regex
регулярные выражения
Если указать только \w и +, то может так получиться, что попавшаяся, например, буква будет достаточной для соответствия. Но если там будут и буквы и цифры, то мы берём их отдельно в скобки и уже к ним относим знак +. То есть до знака @ может быть не просто [буква или цифра], а и [буква и/или цифра]. То же касается знака точки и нижнее подчёркивание. Нельзя просто так сказать \w, ибо не факт, что будут только буквы. К этой логике просто нужно привыкнуть.
Перечитал ответ, но все-равно не очень понятно, почему был избран данный подход, ведь (\w|\.|-) и (\w|\d|\.|_|-) работают одинаковым образом, а именно: оба паттерна позволяют создать "1@example.com", "a@example.com", "_@example.com", "-@example.com" и даже "-_1a@example.com"
Дело в том что \w это массив из символов, который включает в себя a-z, A-Z, 0-9, _, и если символ попадает в этот массив - он соответствует паттерну, в этом случае порядок символов в группе не важен: главное чтобы введенные символы входили в этот массив (эквивалент оператору OR).
Это выражение можно еще сократить, если учесть что:
+ это эквивалент {1,}
\w уже содержит в себе []
\w уже содержит в себе \d и _
можно избежать знаков | и экранирования символов если использовать массив
Вот что получилось у меня: ^([\w.-])+@(\w)+\.\w+\.?\w*$
Оба выражения выдавали одинаковые результаты в вышеуказанных примерах.
Решается это внесением квантификатора в группу:
было (\w)+ стало (\w+)
Таким образом мы получаем еще и полезное в плане парсинга выражение:
^([\w.-]+)@(\w+)\.\w+\.?\w*$