Как проверить 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() — Находит позицию первого вхождения символа или подстроки.