Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как проверить email

Короткий ответ

Простое регулярное выражение проверяет общую форму: что-то, @, домен с точкой:

void main() {
    String pattern = "^[\\w.+-]+@[\\w-]+(\\.[\\w-]+)+$";
 
    IO.println("anna@example.com".matches(pattern));
    IO.println("anna@example".matches(pattern));
    IO.println("anna example.com".matches(pattern));
}

Результат:

true
false
false

Заранее скомпилированный шаблон

String.matches() каждый раз заново компилирует выражение. Если проверок много, создайте Pattern один раз:

static final Pattern EMAIL = Pattern.compile("^[\\w.+-]+@[\\w-]+(\\.[\\w-]+)+$");
 
void main() {
    var emails = List.of("oleg@mail.de", "bad@", "a.b+tag@site.co.uk");
    for (String email : emails) {
        IO.println(email + " -> " + EMAIL.matcher(email).matches());
    }
}

Результат:

oleg@mail.de -> true
bad@ -> false
a.b+tag@site.co.uk -> true

Перед проверкой

Пользователи часто вводят пробелы и заглавные буквы. Нормализуйте адрес до проверки:

void main() {
    String input = "  Anna@Example.COM ";
    String email = input.strip().toLowerCase(Locale.ROOT);
 
    IO.println(email);
}

Результат:

anna@example.com

Частая ошибка

Пытаться написать «идеальное» выражение. Стандарт адресов почты очень сложный, и строгая проверка отсекает настоящие адреса. Проверяйте форму простым выражением, а существование адреса — письмом с подтверждением. А вот слишком простое выражение .+@.+ пропустит явные ошибки:

void main() {
    IO.println("a@b@c".matches(".+@.+"));
}

Результат:

true

Функции из этого ответа

  • String.matches() — Проверяет, соответствует ли вся строка регулярному выражению.
  • Pattern.compile() — Компилирует регулярное выражение в объект Pattern, который можно использовать много раз.
  • String.indexOf() — Находит позицию первого вхождения символа или подстроки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.