← Назад к вопросам
Создать функцию для валидации email
1.7 Middle🔥 171 комментариев
#JavaScript Core
Условие
Напишите функцию isValidEmail(email), которая проверяет корректность email-адреса.
Требования
- Email должен содержать символ @
- Перед @ должна быть хотя бы одна буква или цифра
- После @ должен быть домен с хотя бы одной точкой
- После последней точки должно быть минимум 2 символа
Примеры
isValidEmail("test@example.com"); // true
isValidEmail("user.name@domain.org"); // true
isValidEmail("invalid"); // false
isValidEmail("@nodomain.com"); // false
isValidEmail("test@.com"); // false
isValidEmail("test@domain"); // false
Бонус
Реализуйте валидацию с помощью регулярного выражения и без него.
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Задача на валидацию email — показывает понимание регулярных выражений и строк.
Решение 1: С регулярным выражением
function isValidEmail(email) {
const regex = /^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
return regex.test(email);
}
// Использование
console.log(isValidEmail("test@example.com")); // true
console.log(isValidEmail("user.name@domain.org")); // true
console.log(isValidEmail("invalid")); // false
console.log(isValidEmail("@nodomain.com")); // false
console.log(isValidEmail("test@.com")); // false
console.log(isValidEmail("test@domain")); // false
Объяснение regex:
^— начало строки[a-zA-Z0-9._+-]+— одна или больше букв, цифр, точка, подчёркивание, плюс, дефис@— обязательный символ @[a-zA-Z0-9.-]+— домен с буквами, цифрами, точками, дефисом\.— обязательная точка[a-zA-Z]{2,}— минимум 2 буквы после точки (TLD)$— конец строки
Решение 2: Без регулярных выражений (string методы)
function isValidEmail(email) {
// Проверка @ символа
const atIndex = email.lastIndexOf('@');
if (atIndex === -1 || atIndex === 0) {
return false;
}
const localPart = email.substring(0, atIndex);
const domain = email.substring(atIndex + 1);
// Проверка local part
if (localPart.length === 0) {
return false;
}
// Проверка domain
const dotIndex = domain.lastIndexOf('.');
if (dotIndex === -1 || dotIndex === 0 || dotIndex === domain.length - 1) {
return false;
}
const tld = domain.substring(dotIndex + 1);
if (tld.length < 2) {
return false;
}
return true;
}
Решение 3: Более строгая валидация regex
// RFC 5322 simplified (но более реалистично)
function isValidEmailStrict(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!regex.test(email)) return false;
const [local, domain] = email.split('@');
// Локальная часть
if (local.length > 64) return false;
if (local.startsWith('.') || local.endsWith('.')) return false;
if (local.includes('..')) return false;
// Доменная часть
const parts = domain.split('.');
if (parts.length < 2) return false;
for (const part of parts) {
if (part.length === 0 || part.length > 63) return false;
if (!/^[a-zA-Z0-9-]+$/.test(part)) return false;
if (part.startsWith('-') || part.endsWith('-')) return false;
}
// TLD должен быть буквами
const tld = parts[parts.length - 1];
if (!/^[a-zA-Z]{2,}$/.test(tld)) return false;
return true;
}
Решение 4: С поддержкой internationalized domain names
function isValidEmailInternational(email) {
// Поддерживает Unicode в доменах
const regex = /^[\p{L}\p{N}_.-]+@[\p{L}\p{N}.-]+\.[\p{L}]{2,}$/u;
return regex.test(email);
}
// Использование
console.log(isValidEmailInternational("用户@例え.jp")); // true
Решение 5: Практическое решение для использования в приложении
interface ValidationResult {
valid: boolean;
error?: string;
}
function validateEmail(email: string): ValidationResult {
// Базовая проверка
if (!email || email.trim() === "") {
return { valid: false, error: "Email не должен быть пустым" };
}
email = email.trim().toLowerCase();
// Проверка длины
if (email.length > 254) {
return { valid: false, error: "Email слишком длинный" };
}
// Проверка @
const atCount = (email.match(/@/g) || []).length;
if (atCount !== 1) {
return { valid: false, error: "Email должен содержать ровно один @" };
}
const [local, domain] = email.split('@');
// Проверка local part
if (!local || local.length > 64) {
return { valid: false, error: "Локальная часть некорректна" };
}
if (!/^[a-zA-Z0-9._+-]+$/.test(local)) {
return { valid: false, error: "Локальная часть содержит недопустимые символы" };
}
if (local.startsWith('.') || local.endsWith('.') || local.includes('..')) {
return { valid: false, error: "Локальная часть содержит недопустимые точки" };
}
// Проверка domain
if (!domain || domain.length < 3) {
return { valid: false, error: "Домен некорректен" };
}
if (!domain.includes('.')) {
return { valid: false, error: "Домен должен содержать точку" };
}
const domainParts = domain.split('.');
for (const part of domainParts) {
if (!part || part.length > 63) {
return { valid: false, error: "Часть домена некорректна" };
}
if (!/^[a-zA-Z0-9-]*[a-zA-Z0-9]$/.test(part)) {
return { valid: false, error: "Часть домена содержит недопустимые символы" };
}
}
// Проверка TLD
const tld = domainParts[domainParts.length - 1];
if (!/^[a-zA-Z]{2,}$/.test(tld)) {
return { valid: false, error: "TLD должен содержать минимум 2 буквы" };
}
return { valid: true };
}
// Использование
const result = validateEmail("test@example.com");
if (result.valid) {
console.log("Email валиден");
} else {
console.log("Ошибка:", result.error);
}
Сравнение подходов
| Решение | Простота | Гибкость | Точность | Рекомендация |
|---|---|---|---|---|
| Regex простой | ✅✅ | Limited | Basic | ✅ Best |
| String методы | ✅ | Good | Good | Production |
| Regex strict | 📊 | High | Very High | Real-world |
| International | 📊 | High | High | Global |
| С ошибками | 📊 | High | High | UX focused |
Best Practices
- Не полагаться только на regex — пользователь может проверить email через ссылку
- Проверять на сервере — никогда не доверять клиенту
- Отправлять подтверждение — это единственная истинная проверка
- Быть реалистичным — RFC 5322 очень сложный
- Показывать ошибки — помогать пользователю исправить
Рекомендации для собеседования
- Начните с простого regex
- Объясните каждую часть regex
- Покажите версию без regex
- Обсудите граничные случаи
- Упомяните server-side валидацию и подтверждение
Итог: Простой regex для быстрой проверки. Более строгая валидация + подтверждение по email для реального приложения.