Проверка адреса электронной почты с использованием регулярных выражений — это распространенная задача, которая может потребоваться в любом приложении, принимающем адреса электронной почты в качестве обязательной информации на этапе регистрации. Возможно, есть и другие варианты использования, но это не предмет обсуждения здесь.
Давайте сразу перейдем к основному обсуждению, а именно к проверке электронной почты в Java с использованием регулярных выражений.
1. Простое регулярное выражение
Регулярное выражение: ^(.+)@(.+)$
Это самый простой вариант, и он касается только символа '@'. До и после символа '@' может быть любое количество символов. Давайте рассмотрим небольшой пример, чтобы понять, что я имею в виду.
List emails = new ArrayList();emails.add("user@domain.com");emails.add("user@domain.co.in");emails.add("user1@domain.com");emails.add("user.name@domain.com");emails.add("user#@domain.co.in");emails.add("user@domaincom");//Invalid emailsemails.add("user#domain.com");emails.add("@yahoo.com");String regex = "^(.+)@(.+)$";Pattern pattern = Pattern.compile(regex);for(String email : emails){Matcher matcher = pattern.matcher(email);System.out.println(email +" : "+ matcher.matches());}
Вывод программы.
user@domain.com : trueuser@domain.co.in : trueuser1@domain.com : trueuser.name@domain.com : trueuser#@domain.co.in : trueuser@domaincom : trueuser#domain.com : false@yahoo.com : false
Этот шаблон доступен в классе EmailValidator Common lang. Так что если он вам подходит, вы можете напрямую использовать этот класс.
2. Добавление ограничений на имя пользователя
Регулярное выражение: ^[A-Za-z0-9+_.-]+@(.+)$
В этом регулярном выражении мы добавили некоторые ограничения на часть имени пользователя в адресе электронной почты. Ограничения в вышеприведенном регулярном выражении следующие:
- [AZ] символы разрешены
- [az] разрешены символы
- [0-9] разрешенные цифры
- Кроме того, электронное письмо может содержать только точку(.), тире(-) и подчеркивание(_).
- Остальные символы не допускаются.
Давайте проверим некоторые адреса электронной почты на соответствие приведенному выше регулярному выражению.
List emails = new ArrayList();emails.add("user@domain.com");emails.add("user@domain.co.in");emails.add("user1@domain.com");emails.add("user.name@domain.com");emails.add("user_name@domain.co.in");emails.add("user-name@domain.co.in");emails.add("user@domaincom");//Invalid emailsemails.add("@yahoo.com");String regex = "^[A-Za-z0-9+_.-]+@(.+)$";Pattern pattern = Pattern.compile(regex);for(String email : emails){Matcher matcher = pattern.matcher(email);System.out.println(email +" : "+ matcher.matches());}
Вывод программы.
user@domain.com : trueuser@domain.co.in : trueuser1@domain.com : trueuser.name@domain.com : trueuser_name@domain.co.in : trueuser-name@domain.co.in : trueuser@domaincom : true@yahoo.com : false
Обратите внимание, что аналогичное ограничение может применяться и к части доменного имени. Тогда регулярное выражение станет таким.
^[A-Z0-9+_.-]+@[A-Z0-9.-]+$
3. Регулярное выражение для проверки RFC-5322
Регулярное выражение: ^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$
В этом примере регулярного выражения используются все символы, разрешенные RFC-5322, который управляет форматом сообщения электронной почты. Некоторые из разрешенных символов представляют угрозу безопасности, если передаются напрямую из пользовательского ввода в оператор SQL, например, одинарная кавычка(') и символ вертикальной черты(|).
При вставке адреса электронной почты в строку, передаваемую другой программе, обязательно экранируйте конфиденциальные символы, чтобы предотвратить бреши в системе безопасности, такие как атаки с использованием SQL-инъекций.
List emails = new ArrayList();emails.add("user@domain.com");emails.add("user@domain.co.in");emails.add("user.name@domain.com");emails.add("user?name@domain.co.in");emails.add("user'name@domain.co.in");//Invalid emailsemails.add("@yahoo.com");String regex = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$";Pattern pattern = Pattern.compile(regex);for(String email : emails){Matcher matcher = pattern.matcher(email);System.out.println(email +" : "+ matcher.matches());}
Вывод программы.
user@domain.com : trueuser@domain.co.in : trueuser.name@domain.com : trueuser?name@domain.co.in : trueuser'name@domain.co.in : true@yahoo.com : false
4. Ограничьте начальные, конечные и последовательные точки
Regex : ^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$
И локальная часть, и доменное имя могут содержать одну или несколько точек, но никакие две точки не могут стоять рядом друг с другом. Кроме того, первый и последний символы в локальной части и в доменном имени не должны быть точками:
List emails = new ArrayList();emails.add("user@domain.com");emails.add("user@domain.co.in");emails.add("user.name@domain.com");emails.add("user'name@domain.co.in");//Invalid emailsemails.add(".username@yahoo.com");emails.add("username@yahoo.com.");emails.add("username@yahoo..com");String regex = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$";Pattern pattern = Pattern.compile(regex);for(String email : emails){Matcher matcher = pattern.matcher(email);System.out.println(email +" : "+ matcher.matches());}
Вывод программы.
user@domain.com : trueuser@domain.co.in : trueuser.name@domain.com : trueuser'name@domain.co.in : true.username@yahoo.com : falseusername@yahoo.com. : falseusername@yahoo..com : false
5. Ограничить длину символов в домене верхнего уровня [рекомендуется]
Теперь давайте изменим регулярное выражение таким образом, чтобы доменное имя включало хотя бы одну точку, а часть доменного имени после последней точки могла состоять только из букв.
Допустим, доменные имена такие, как secondlevel.com или thirdlevel.secondlevel.com. Домен верхнего уровня(.com в этих примерах) должен состоять только из двух-шести букв.
Regex : ^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$
List emails = new ArrayList();emails.add("user@domain.com");emails.add("user@domain.co.in");emails.add("user.name@domain.com");emails.add("user_name@domain.com");emails.add("username@yahoo.corporate.in");//Invalid emailsemails.add(".username@yahoo.com");emails.add("username@yahoo.com.");emails.add("username@yahoo..com");emails.add("username@yahoo.c");emails.add("username@yahoo.corporate");String regex = "^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$";Pattern pattern = Pattern.compile(regex);for(String email : emails){Matcher matcher = pattern.matcher(email);System.out.println(email +" : "+ matcher.matches());}
Вывод программы.
user@domain.com : trueuser@domain.co.in : trueuser.name@domain.com : trueuser_name@domain.com : trueusername@yahoo.corporate.in : true.username@yahoo.com : falseusername@yahoo.com. : falseusername@yahoo..com : falseusername@yahoo.c : falseusername@yahoo.corporate : false
Это последнее регулярное выражение — моя рекомендация для простой проверки электронной почты в Java. Обратите внимание, что проверка электронной почты в Java без регулярного выражения возможна, но не рекомендуется. Везде, где вам нужно иметь дело с шаблонами, регулярные выражения — ваши друзья.
Пожалуйста, не стесняйтесь использовать это регулярное выражение, а также редактировать его в соответствии с дополнительными потребностями вашего приложения.