- Примеры регулярных выражений электронной почты Java
- 1. Регулярное выражение Электронной Почты – Простая проверка.
- 2. Регулярное выражение Электронной Почты – Строгая проверка.
- 3. Регулярное выражение электронной почты – Нелатинские символы или символы Юникода
- 4. Валидатор Apache Commons – Электронная почта
- Скачать Исходный Код
- Рекомендации
Примеры регулярных выражений электронной почты Java
В этой статье показано, как использовать регулярное выражение для проверки электронной почты на Java.
Формат адреса электронной почты является локальной частью @домена . Посмотрите на этот адрес электронной почты mkyong@example.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 = "#- Run test with email = ") @MethodSource("validEmailProvider") void test_email_valid(String email) < assertTrue(EmailValidatorSimple.isValid(email)); >@ParameterizedTest(name = "# - Run test with email = ") @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. Регулярное выражение Электронной Почты – Строгая проверка.
^(?=.@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z])$
Это регулярное выражение электронной почты немного сложное и отвечает следующим требованиям к электронной почте:
- прописные и строчные латинские буквы от А до Я и от а до 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
Еще раз просмотрите регулярное выражение электронной почты.
^(?=.@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z])$
Объяснение регулярного выражения по электронной почте.
(?=.@) # 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]) # 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 = "^(?=.@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@" + "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z])$"; private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN); public static boolean isValid(final String email) < Matcher matcher = pattern.matcher(email); return matcher.matches(); >>
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 = "#- Run test with email = ") @MethodSource("validEmailProvider") void test_email_valid(String email) < assertTrue(EmailValidatorStrict.isValid(email)); >@ParameterizedTest(name = "# - Run test with email = ") @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 Если мы хотим поддерживать дополнительные специальные символы, такие как +=!$%| в локальная часть , просто поместите его в скобку []
Примечание Пожалуйста, не ставьте слишком строгие требования к проверке электронной почты, так как это приведет к отклонению многих действительных писем. Эта строгая версия регулярного выражения электронной почты является хорошим балансом того, что в большинстве случаев считается действительным электронным письмом.
P.S. Эта строгая версия регулярного выражения электронной почты не поддерживает Юникод.
3. Регулярное выражение электронной почты – Нелатинские символы или символы Юникода
Чтобы регулярное выражение поддерживало интернационализацию, Юникод или нелатинские адреса электронной почты, попробуйте заменить совпадающий символ A-Za-z с a \p . Прочитайте это Регулярные выражения Юникода .
Примеры адресов электронной почты в Юникоде
"我買@屋企.香港", // chinese characters "二ノ宮@黒川.日本", // Japanese characters
Приведенное ниже регулярное выражение обновило предыдущую строгую версию регулярного выражения электронной почты, заменив A-Za-z на \\p для поддержки адреса электронной почты в Юникоде.
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 = "^(?=.@)[\\p0-9_-]+(\\.[\\p0-9_-]+)*@" + "[^-][\\p0-9-]+(\\.[\\p0-9-]+)*(\\.[\\p])$"; private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN); public static boolean isValid(final String email) < Matcher matcher = pattern.matcher(email); return matcher.matches(); >>
@ParameterizedTest(name = "# - Run test with email = ") @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); >>
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 = "#- Run test with email = ") @MethodSource("validEmailProvider") void test_email_valid(String email) < assertTrue(EmailValidatorApache.isValid(email)); >@ParameterizedTest(name = "# - Run test with email = ") @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: проверка адреса на основе регулярных выражений .
Скачать Исходный Код
$cd java-регулярное выражение/электронная почта