Формат адреса электронной почты является локальной частью @домена
. Посмотрите на этот адрес электронной почты 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 StreamvalidEmailProvider() { 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 StreamvalidEmailProvider() { 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 StreamvalidEmailProvider() { 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 StreamvalidEmailProvider() { 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/”