Формат адреса электронной почты является локальной частью @домена . Посмотрите на этот адрес электронной почты mkyong@example.com
локальная часть@= @домен.com
Формальные определения адреса электронной почты приведены в RFC 5322 и RFC 3696 . Однако в этой статье не будет следовать приведенному выше RFC для проверки электронной почты. Официальное электронное письмо “локальная часть” слишком сложное (поддерживает слишком много специальных символов, символов, комментариев, цитат…) для реализации с помощью регулярного выражения. Большинство компаний или веб-сайтов предпочитают разрешать только определенные специальные символы, такие как точка (.), подчеркивание (_) и дефис (-).
В этой статье будет показано несколько способов проверки адреса электронной почты с помощью регулярного выражения:
- Регулярное выражение электронной почты – Простой
- Регулярное выражение электронной почты – Строгое
- Регулярное выражение электронной почты – Нелатинские символы или символы Юникода
- Проверка 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,})$
Это регулярное выражение электронной почты немного сложное и отвечает следующим требованиям к электронной почте:
локальная часть
- прописные и строчные латинские буквы от А до Я и от а до z
- цифры от 0 до 9
- Разрешить точку (.), подчеркивание (_) и дефис (-)
- точка (.) не является первым или последним символом
- точка (.) не появляется последовательно, например, mkyong..yong@example.com не допускается
- Максимум 64 символа
В электронной почте локальная часть много специальных символов, таких как #$%&'*+-/=? являются технически допустимыми, но большинство почтовых серверов или веб-приложений не принимают их все. Это регулярное выражение электронной почты принимает только общую точку (.), подчеркивание (_) и дефис (-).
домен
- прописные и строчные латинские буквы от А до Я и от а до z
- цифры от 0 до 9
- дефис (-) не является первым или последним символом
- точка (.) не является первым или последним символом
- точка (.) не появляется последовательно
- минимум 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-регулярное выражение/электронная почта
Рекомендации
- Регулярные Выражения Электронной Почты
- Регулярные выражения Юникода
- Адрес электронной почты Википедии
- Проверка электронной почты на JavaScript
- Регулярное выражение \p{L} и \p{N}
- RFC822: проверка адреса на основе регулярных выражений
- JUnit 5 Параметризованные тесты
Оригинал: “https://mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/”