Очень таки часто появляется потребность получение email адреса от пользователя, так вот об этом мы и поговорим в данном уроке.
Хочу сказать, что в данном уроке я хочу продемонстрировать пример использования регулярных выражений на примере email.
Давайте рассмотрим как ведут себя обе стороны приложение и пользователь.
Действия пользователя:
1) Пользователь вводит свой e-mail в соответствующее поле ввода.
2) Пользователь нажимает на кнопку, после чего происходит действие отправки письма.
Действия приложения:
1) После нажатия пользователем кнопки, приложение проверяет на валидность email адрес;
1.1) в случае не валидного email адреса приложение выводит пользователю соответствующее сообщение;
1.2) в случае валидного email адреса приложение отправляет письмо.
Шаг 1.
Пишем регулярное выражение.
Регулярные выражения — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов.
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
В данном регулярном выражении указанно, что строка может состоять с _A-Za-z0-9 допускаемых символов, после чего идет символ @ и опять допускаемые символы.
Шаг 2.
Создаем maven проект и класс EmailValidator.java со следующим содержимым:
package com.devcolibri.validator; import java.util.regex.Matcher; import java.util.regex.Pattern; public class EmailValidator { private Pattern pattern; private Matcher matcher; private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; public EmailValidator() { pattern = Pattern.compile(EMAIL_PATTERN); } public boolean validate(final String hex) { matcher = pattern.matcher(hex); return matcher.matches(); } }
теперь разберем все:
Pattern pattern
– мы используем для построение шаблона, в нашем случае регулярного выражения.
Matcher matcher
– используется для проверки регулярного выражения.
Pattern.compile(EMAIL_PATTERN)
– компилируем регулярное выражение перед его использованием (это чувствительно сократит время).
matcher = pattern.matcher(hex)
– задаем строку которую нужно проверить.
matcher.matches()
– выполняем проверку соответствия строки с регулярным выражением.
Шаг 3.
Не зря мы создали Maven проект, так как мы будем тестировать наш валидатор с помощью JUnit и TestNG.
Давайте в pom.xml добавим зависимости:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>EmailValidate</groupId> <artifactId>EmailValidate</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8</version> </dependency> </dependencies> </project>
Шаг 4.
Создадим класс EmailValidatorTest.java в нем напишем тесты которые будут проверять правильно ли работает наше регулярное выражение.
package com.devcolibri.validator; import org.junit.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class EmailValidatorTest { private EmailValidator emailValidator; @BeforeClass public void initData() { emailValidator = new EmailValidator(); } @DataProvider public Object[][] ValidEmailProvider() { return new Object[][] { { new String[] { "alex@yandex.ru", "alex-27@yandex.com", "alex.27@yandex.com", "alex111@devcolibri.com", "alex.100@devcolibri.com.ua", "alex@1.com", "alex@gmail.com.com", "alex+27@gmail.com", "alex-27@yandex-test.com" } } }; } @DataProvider public Object[][] InvalidEmailProvider() { return new Object[][] { { new String[] { "devcolibri", "alex@.com.ua", "alex123@gmail.a", "alex123@.com", "alex123@.com.com", ".alex@devcolibri.com", "alex()*@gmail.com", "alex@%*.com", "alex..2013@gmail.com", "alex.@gmail.com", "alex@devcolibri@gmail.com", "alex@gmail.com.1ua" } } }; } @Test(dataProvider = "ValidEmailProvider") public void ValidEmailTest(String[] Email) { for (String temp : Email) { boolean valid = emailValidator.validate(temp); System.out.println("Email: " + temp + " -> " + valid); Assert.assertEquals(valid, true); } } @Test(dataProvider = "InvalidEmailProvider", dependsOnMethods = "ValidEmailTest") public void InValidEmailTest(String[] Email) { for (String temp : Email) { boolean valid = emailValidator.validate(temp); System.out.println("Email: " + temp + " -> " + valid); Assert.assertEquals(valid, false); } } }
Результат тестирования:
P.S. Спасибо за внимание, оставляем комментарии и подписуемся на обновления!
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
7 комментариев к статье "Валидация E-mail адреса с помощью регулярных выражений"
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
private static final String EMAIL_PATTERN =
“^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@” +
“[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$”;
public EmailValidator() {
pattern = Pattern.compile(EMAIL_PATTERN);
}
Зачем каждый раз при создании валидатора компилировать паттерн?
Гораздо лучше будет вынести сразу скомпилированный паттерн в static final
Хм. Спасибо. Что то не подумал даже. Да, согласен, так намного лучше.
Вопрос такой, подскажите, пожалуйста, как добавить независимость тестам dataProvider, то есть если один набор данных не правильный не падал весь тест.
Отличная неработающая регулярка.
кто-то просто не умеет ее правильно готовить, все работает
напишите пж выражение чтобы письма проходили только от гугла и яндекса
В примере Выше допущено множество ошибок!
———————————————————————————————–
String emailCheck=”^[a-zA-Z0-9]{1,}”+”((\\.|\\_|-{0,1})[a-zA-Z0-9]{1,})*”+”@”
+”[a-zA-Z0-9]{1,}”+”((\\.|\\_|-{0,1})[a-zA-Z0-9]{1,})*”+”\\.[a-zA-Z]{2,}$”;
————————————————————————————————-
Вот работающий код.
И, сразу оговоримся, на разных почтовых сервисах разный алгоритм проверки и допустимые символы! Например на гугле нельзя нижнее подчеркивание использовать и т.п.
Что проверяет код: должна быть латиница, первым должен быть символ латиницы от а до z в любом регистре или цифра; далее может встречаться или “.” или “_” или “-“, но обязательно с последующим одним или более символом латиницы или цифрой(рами) и все это много раз(это исключает задвоение перечисленных символов типа “..”, “—“, “_____”); далее один символ @; далее хоть один символ латиницы или цифра(или множество оных); снова допустимые знаки без задвоения; и концовка: обязательная точка, и два и более символа латиницей.