Рубрики
Без рубрики

Примеры регулярных выражений электронной почты Java

В этой статье показано, как использовать регулярное выражение для проверки электронной почты на Java.

Формат адреса электронной почты является локальной частью @домена . Посмотрите на этот адрес электронной почты mkyong@example.com

  1. локальная часть
  2. @ = @
  3. домен .com

Формальные определения адреса электронной почты приведены в RFC 5322 и RFC 3696 . Однако в этой статье не будет следовать приведенному выше RFC для проверки электронной почты. Официальное электронное письмо “локальная часть” слишком сложное (поддерживает слишком много специальных символов, символов, комментариев, цитат…) для реализации с помощью регулярного выражения. Большинство компаний или веб-сайтов предпочитают разрешать только определенные специальные символы, такие как точка (.), подчеркивание (_) и дефис (-).

В этой статье будет показано несколько способов проверки адреса электронной почты с помощью регулярного выражения:

  1. Регулярное выражение электронной почты – Простой
  2. Регулярное выражение электронной почты – Строгое
  3. Регулярное выражение электронной почты – Нелатинские символы или символы Юникода
  4. Проверка Apache Commons v1.7

1. Регулярное выражение Электронной Почты – Простая проверка.

В этом примере используется простое регулярное выражение ^(.+)@(\ S+)$ для подтверждения адреса электронной почты. Он проверяет, чтобы электронное письмо содержало по крайней мере один символ, символ @, а затем не пробел .

Объяснение регулярного выражения электронной почты:

^                       #start of the line
  (                     #   start of group #1
    .+                  #     any characters (matches Unicode), must contains one or more (+)
  )                     #   end of group   #1
    @                   #     must contains a "@" symbol
      (                 #         start of group #2
        \S+             #           non white space characters, must contains one or more (+)
      )                 #         end of group #2
$                       #end of the line

1.1 Пример Java, использующий приведенное выше регулярное выражение для проверки электронной почты.

package com.mkyong.regex.email;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailValidatorSimple {

    private static final String EMAIL_PATTERN = "^(.+)@(\\S+)$";

    private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN);

    public static boolean isValid(final String email) {
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

}

1.2 Ниже приведен модуль 5 модульных тестов для проверки некоторых действительных и недействительных электронных писем.

package com.mkyong.regex;

import com.mkyong.regex.email.EmailValidatorSimple;
import com.mkyong.regex.email.EmailValidatorStrict;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class EmailValidatorSimpleTest {

    @ParameterizedTest(name = "#{index} - Run test with email = {0}")
    @MethodSource("validEmailProvider")
    void test_email_valid(String email) {
        assertTrue(EmailValidatorSimple.isValid(email));
    }

    @ParameterizedTest(name = "#{index} - Run test with email = {0}")
    @MethodSource("invalidEmailProvider")
    void test_email_invalid(String email) {
        assertFalse(EmailValidatorSimple.isValid(email));
    }

    // Valid email addresses
    static Stream validEmailProvider() {
        return Stream.of(
                "hello@example.com",                // simple
                "hello@example.co.uk",              // .co.uk
                "hello-.+_=#|@example.com",         // special characters
                "h@example.com",                    // local-part one letter
                "h@com",                            // domain one letter
                "我買@屋企.香港"                      // unicode, chinese characters
        );
    }

    // Invalid email addresses
    static Stream invalidEmailProvider() {
        return Stream.of(
                "hello",                            // email need at least one @
                "hello@ "                           // domain cant end with space (whitespace)
        );
    }

}

Приведенное выше регулярное выражение электронной почты мало что проверяло и фильтровало только странные или недействительные электронные письма. Кроме того, точка соответствует интернационализации или адресу электронной почты в Юникоде.

2. Регулярное выражение Электронной Почты – Строгая проверка.

^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$

Это регулярное выражение электронной почты немного сложное и отвечает следующим требованиям к электронной почте:

локальная часть

  1. прописные и строчные латинские буквы от А до Я и от а до z
  2. цифры от 0 до 9
  3. Разрешить точку (.), подчеркивание (_) и дефис (-)
  4. точка (.) не является первым или последним символом
  5. точка (.) не появляется последовательно, например, mkyong..yong@example.com не допускается
  6. Максимум 64 символа

В электронной почте локальная часть много специальных символов, таких как #$%&'*+-/=? являются технически допустимыми, но большинство почтовых серверов или веб-приложений не принимают их все. Это регулярное выражение электронной почты принимает только общую точку (.), подчеркивание (_) и дефис (-).

домен

  1. прописные и строчные латинские буквы от А до Я и от а до z
  2. цифры от 0 до 9
  3. дефис (-) не является первым или последним символом
  4. точка (.) не является первым или последним символом
  5. точка (.) не появляется последовательно
  6. минимум 2 символа дву

Ниже приведены примеры действительных адресов электронной почты.

hello@example.com
hello@example.co.uk             // .co.uk, 2 tld
hello-2020@example.com          // -
hello.2020@example.com          // .
hello_2020@example.com          // _
h@example.com                   // local-part one letter
h@example-example.com           // domain contains a hyphen -
h@example-example-example.com   // domain contains two hyphens - -
h@example.example-example.com   // domain contains . -
hello.world-2020@example.com    // local-part contains . -                

Ниже приведены примеры недействительных адресов электронной почты.

hello                            // email need at least one @
hello@2020@example.com           // email doesn't allow more than one @
.hello@example.com               // local-part can't start with a dot .
hello.@example.com               // local-part can't end with a dot .
hello..world@example.com         // local part don't allow dot . appear consecutively
hello!+2020@example.com          // local-part don't allow special characters like !+
hello@example.a                  // domain tld min 2 chars
hello@example..com               // domain doesn't allow dot . appear consecutively
hello@.com                       // domain doesn't start with a dot .
hello@.com.                      // domain doesn't end with a dot .
hello@-example.com               // domain doesn't allow to start with a hyphen -
hello@example.com-               // domain doesn't allow to end with a hyphen -
hello@example_example.com        // domain doesn't allow underscore
1234567890123456789012345678901234567890123456789012345678901234xx@example.com // local part is longer than 64 characters

Еще раз просмотрите регулярное выражение электронной почты.

^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$

Объяснение регулярного выражения по электронной почте.

(?=.{1,64}@)            # local-part min 1 max 64

[A-Za-z0-9_-]+          # Start with chars in the bracket [ ], one or more (+)
                        # dot (.) not in the bracket[], it can't start with a dot (.)

(\\.[A-Za-z0-9_-]+)*	 # follow by a dot (.), then chars in the bracket [ ] one or more (+)
                        # * means this is optional
                        # this rule for two dots (.)

@                       # must contains a @ symbol

[^-]                    # domain can't start with a hyphen (-)

[A-Za-z0-9-]+           # Start with chars in the bracket [ ], one or more (+)     

(\\.[A-Za-z0-9-]+)*      # follow by a dot (.), optional

(\\.[A-Za-z]{2,})       # the last tld, chars in the bracket [ ], min 2

2.1 Пример Java, использующий приведенное выше регулярное выражение для проверки электронной почты.

package com.mkyong.regex.email;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailValidatorStrict {

    private static final String EMAIL_PATTERN =
            "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@"
            + "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$";

    private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN);

    public static boolean isValid(final String email) {
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

}

2.2 Модульные тесты.

package com.mkyong.regex;

import com.mkyong.regex.email.EmailValidatorStrict;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;

public class EmailValidatorStrictTest {

    @ParameterizedTest(name = "#{index} - Run test with email = {0}")
    @MethodSource("validEmailProvider")
    void test_email_valid(String email) {
        assertTrue(EmailValidatorStrict.isValid(email));
    }

    @ParameterizedTest(name = "#{index} - Run test with email = {0}")
    @MethodSource("invalidEmailProvider")
    void test_email_invalid(String email) {
        assertFalse(EmailValidatorStrict.isValid(email));
    }

    // Valid email addresses
    static Stream validEmailProvider() {
        return Stream.of(
                "hello@example.com",                // simple
                "hello@example.co.uk",              // .co.uk, 2 tld
                "hello-2020@example.com",           // -
                "hello.2020@example.com",           // .
                "hello_2020@example.com",           // _
                "h@example.com",                    // local-part one letter
                "h@example-example.com",            // domain contains a hyphen -
                "h@example-example-example.com",    // domain contains two hyphens - -
                "h@example.example-example.com",    // domain contains . -
                "hello.world-2020@example.com");    // local-part contains . -
    }

    // Invalid email addresses
    static Stream invalidEmailProvider() {
        return Stream.of(
                "我買@屋企.香港",                     // this regex doesn't support Unicode
                "hello",                            // email need at least one @
                "hello@2020@example.com",           // email doesn't allow more than one @
                ".hello@example.com",               // local-part can't start with a dot .
                "hello.@example.com",               // local-part can't end with a dot .
                "hello..world@example.com",         // local part don't allow dot . appear consecutively
                "hello!+2020@example.com",          // local-part don't allow special characters like !+
                "hello@example.a",                  // domain tld min 2 chars
                "hello@example..com",               // domain doesn't allow dot . appear consecutively
                "hello@.com",                       // domain doesn't start with a dot .
                "hello@.com.",                      // domain doesn't end with a dot .
                "hello@-example.com",               // domain doesn't allow to start with a hyphen -
                "hello@example.com-",               // domain doesn't allow to end with a hyphen -
                "hello@example_example.com",        // domain doesn't allow underscore
                "1234567890123456789012345678901234567890123456789012345678901234xx@example.com"); // local part is longer than 64 characters
    }

}

P.S Если мы хотим поддерживать дополнительные специальные символы, такие как +=!$%| в локальная часть , просто поместите его в скобку []

[A-Za-z0-9_-+=!$%|]

Примечание Пожалуйста, не ставьте слишком строгие требования к проверке электронной почты, так как это приведет к отклонению многих действительных писем. Эта строгая версия регулярного выражения электронной почты является хорошим балансом того, что в большинстве случаев считается действительным электронным письмом.

P.S. Эта строгая версия регулярного выражения электронной почты не поддерживает Юникод.

3. Регулярное выражение электронной почты – Нелатинские символы или символы Юникода

Чтобы регулярное выражение поддерживало интернационализацию, Юникод или нелатинские адреса электронной почты, попробуйте заменить совпадающий символ A-Za-z с a \p{L} . Прочитайте это Регулярные выражения Юникода .

Примеры адресов электронной почты в Юникоде

"我買@屋企.香港",                     // chinese characters
"二ノ宮@黒川.日本",                   // Japanese characters

Приведенное ниже регулярное выражение обновило предыдущую строгую версию регулярного выражения электронной почты, заменив A-Za-z на \\p{L} для поддержки адреса электронной почты в Юникоде.

^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@[^-][\\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$

3.1 Проверка регулярного выражения электронной почты Java, версия в Юникоде.

package com.mkyong.regex.email;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailValidatorUnicode {

    private static final String EMAIL_PATTERN =
            "^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@"
            + "[^-][\\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$";

    private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN);

    public static boolean isValid(final String email) {
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

}

3.2 Модульные тесты.

  @ParameterizedTest(name = "#{index} - Run test with email = {0}")
  @MethodSource("validEmailProvider")
  void test_email_valid(String email) {
      assertTrue(EmailValidatorUnicode.isValid(email));
  }

  // Valid email addresses
  static Stream validEmailProvider() {
      return Stream.of(
              "hello@example.com",                // simple
              "hello@example.co.uk",              // .co.uk, 2 tld
              "hello-2020@example.com",           // -
              "hello.2020@example.com",           // .
              "hello_2020@example.com",           // _
              "h@example.com",                    // local-part one letter
              "h@example-example.com",            // domain contains a hyphen -
              "h@example-example-example.com",    // domain contains two hyphens - -
              "h@example.example-example.com",    // domain contains . -
              "hello.world-2020@example.com",     // local part contains . -
              "我買@屋企.香港",                     // chinese characters
              "二ノ宮@黒川.日本",                    // Japanese characters
              "δοκιμή@παράδειγμα.δοκιμή");        // Greek alphabet
  }

4. Валидатор Apache Commons – Электронная почта

На этот раз мы тестируем Валидатор Apache Commons для проверки адреса электронной почты.

  
      commons-validator
      commons-validator
      1.7
  

P.S Размер файла Размер файла составляет около 190 КБ.

Внутренне, commons-валидатор смешанное использование пользовательского кода и регулярного выражения для проверки адреса электронной почты.

package org.apache.commons.validator.routines;

public class EmailValidator implements Serializable {

    //...

    public boolean isValid(String email) {
        if (email == null) {
            return false;
        }

        if (email.endsWith(".")) { // check this first - it's cheap!
            return false;
        }

        // Check the whole email address structure
        Matcher emailMatcher = EMAIL_PATTERN.matcher(email);
        if (!emailMatcher.matches()) {
            return false;
        }

        if (!isValidUser(emailMatcher.group(1))) {
            return false;
        }

        if (!isValidDomain(emailMatcher.group(2))) {
            return false;
        }

        return true;
    }

}

4.1 Проверка электронной почты Java с помощью средства проверки Apache Commons.

package com.mkyong.regex.email;

import org.apache.commons.validator.routines.EmailValidator;

public class EmailValidatorApache {

    //doesn't consider local addresses as valid.
    //default, allowLocal = false, allowTld = false
    private static final EmailValidator validator = EmailValidator.getInstance();

    //private static final EmailValidator validator = EmailValidator.getInstance(true);
    //private static final EmailValidator validator = EmailValidator.getInstance(true, true);

    public static boolean isValid(final String email) {
        return validator.isValid(email);
    }

}

4.2 Модульные тесты.

package com.mkyong.regex;

import com.mkyong.regex.email.EmailValidatorApache;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class EmailValidatorApacheTest {

    @ParameterizedTest(name = "#{index} - Run test with email = {0}")
    @MethodSource("validEmailProvider")
    void test_email_valid(String email) {
        assertTrue(EmailValidatorApache.isValid(email));
    }

    @ParameterizedTest(name = "#{index} - Run test with email = {0}")
    @MethodSource("invalidEmailProvider")
    void test_email_invalid(String email) {
        assertFalse(EmailValidatorApache.isValid(email));
    }

    // Valid email addresses
    static Stream validEmailProvider() {
        return Stream.of(
                "hello@example.com",                // simple
                "hello@example.co.uk",              // .co.uk, 2 tld
                "hello!#$%&'*+-/=?^_`{|}~2020@example.com",  // many special chars
                "h@example.com",                    // local-part one letter
                "h@example-example.com",            // domain contains a hyphen -
                "h@example-example-example.com",    // domain contains two hyphens - -
                "h@example.example-example.com",    // domain contains . -
                "hello.world-2020@example.com",     // local part contains . -
                "我買@屋企.香港");                   // Support Unicode
    }

    // Invalid email addresses
    static Stream invalidEmailProvider() {
        return Stream.of(

                "hello",                            // email need at least one @
                "hello@2020@example.com",           // email don't allow more than one @
                ".hello@example.com",               // local-part can't start with a dot .
                "hello.@example.com",               // local-part can't end with a dot .
                "hello..world@example.com",         // local part don't allow dot . appear consecutively
                // apache supports many special characters
                //"hello!+2020@example.com",          // local-part don't allow special characters like !+
                "hello@example.a",                  // domain tld min 2 chars
                "hello@example..com",               // domain part don't allow dot . appear consecutively
                "hello@.com",                       // domain part don't start with a dot .
                "hello@.com.",                      // domain part don't end with a dot .
                "hello@-example.com",               // domain part don't allow to start with a hyphen -
                "hello@example.com-",               // domain part don't allow to end with a hyphen -
                "hello@example_example.com",        // domain part don't allow underscore
                "1234567890123456789012345678901234567890123456789012345678901234xx@example.com"); // local part is longer than 64 characters
    }

}

Сравните с приведенной выше строгой версией регулярного выражения электронной почты. Этот commons-валидатор поддерживает множество специальных символов, таких как ! #$%&'* +-/=?^_{|}~ , даже символы Юникода, и соответствует общим рекомендациям по электронной почте, которые определены в примере 2. Если вы не возражаете включить дополнительную библиотеку объемом 190 КБ для проверки электронных писем, этот commons-валидатор является хорошим выбором.

P.S Этот общий доступ-валидатор не полностью соответствует RFC 5322 (RFC 5322) или RFC 3696 (RFC 3696) .

Примечание

Если вас интересует, как выглядит регулярное выражение электронной почты RFC822, пожалуйста, посетите этот RFC822: проверка адреса на основе регулярных выражений .

Скачать Исходный Код

$клон git $клон git

$cd java-регулярное выражение/электронная почта

Рекомендации

Оригинал: “https://mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/”