Валидация E-mail адреса с помощью регулярных выражений

Очень таки часто появляется потребность получение 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. Спасибо за внимание, оставляем комментарии и подписуемся на обновления!

Урок создан: 24 апреля 2013 | Просмотров: 16589 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 26 апреля 2013 в 11:30

    paralainer

    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

  • 19 сентября 2014 в 17:44

    Petr

    Вопрос такой, подскажите, пожалуйста, как добавить независимость тестам dataProvider, то есть если один набор данных не правильный не падал весь тест.

  • 13 марта 2016 в 12:45

    Александр

    Отличная неработающая регулярка.

    • 28 сентября 2016 в 15:45

      Михаил

      кто-то просто не умеет ее правильно готовить, все работает

  • 26 марта 2017 в 21:05

    Антон

    напишите пж выражение чтобы письма проходили только от гугла и яндекса

    • 13 июня 2017 в 00:16

      Alex

      В примере Выше допущено множество ошибок!
      ————————————————————————————————
      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 в любом регистре или цифра; далее может встречаться или «.» или «_» или «-«, но обязательно с последующим одним или более символом латиницы или цифрой(рами) и все это много раз(это исключает задвоение перечисленных символов типа «..», «—«, «_____»); далее один символ @; далее хоть один символ латиницы или цифра(или множество оных); снова допустимые знаки без задвоения; и концовка: обязательная точка, и два и более символа латиницей.