Где я могу найти регулярное выражение Java для проверки электронной почты иностранных символов (RFC 6530)? - PullRequest
0 голосов
/ 15 июня 2019

Я попробовал emailregex.com и использовал их регулярное выражение Java, но для международных символов это не удалось.Я также протестировал стандартное регулярное выражение RFC на regexr.com .Мне нужно регулярное выражение, которое будет проверять все следующее:

  • корова 牛 @ yahoo.com
  • email@example.com
  • user @ butterfly-effect.com

Я знаю, что регулярное выражение невозможно захватить 100% электронных писем, но мне нужно включить международные символы.Да, и разрешены международные символы в адресах электронной почты .

У меня изначально был этот (https://stackoverflow.com/a/26989421/148844), но он не смог проверить дефисные домены.

Iпробовал:

InternetAddress ia = new InternetAddress("cow牛@yahoo.com");

но скинул

javax.mail.internet.AddressException: недопустимый символ в адресе (корова 牛 @ yahoo.com, 3)

Я попытался выполнить поиск в Интернете, но не нашел соответствующих результатов.

https://duckduckgo.com/?q=RFC+6530+regex

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Если вы включите Юникод для этого регулярного выражения, оно будет соответствовать
Международным символам слова.В основном, алфавит, но не пунктуация.

Это регулярное выражение RFC5322, где [a-zA-Z0-9] заменено на [^\W_]
, которое вводит конструкцию \w, которая при использовании в Unicode расширяет допустимые алфавиты
.

Raw:

(?im)^(?=.{1,64}@)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:[^\W_](?:\.(?!\.)|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)?[^\W_]@))(?=.{1,255}$)(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:(?=.{1,63}\.)[^\W_][-\w]*[^\W_]*\.)+[^\W_](?:[^\W_]|-){0,22}[^\W_])|((?=.{1,63}$)[^\W_][-\w]*))$   

( Не забудьте флаг Unicode )

https://regex101.com/r/98Z0Ls/1

Stringed:

"(?im)^(?=.{1,64}@)(?:(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"@)|((?:[^\\W_](?:\\.(?!\\.)|[-!#\\$%&'\\*\\+/=\\?\\^`\\{\\}\\|~\\w])*)?[^\\W_]@))(?=.{1,255}$)(?:(\\[(?:\\d{1,3}\\.){3}\\d{1,3}\\])|((?:(?=.{1,63}\\.)[^\\W_][-\\w]*[^\\W_]*\\.)+[^\\W_](?:[^\\W_]|-){0,22}[^\\W_])|((?=.{1,63}$)[^\\W_][-\\w]*))$"  


Однако я предлагаю заменить [^\W_] на [\pL\pN] , чтобы исключить
символы типа lowline, из которых около 2000.

Raw:

(?im)^(?=.{1,64}@)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:[\pL\pN](?:\.(?!\.)|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)?[\pL\pN]@))(?=.{1,255}$)(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:(?=.{1,63}\.)[\pL\pN][-\w]*[\pL\pN]*\.)+[\pL\pN](?:[\pL\pN]|-){0,22}[\pL\pN])|((?=.{1,63}$)[\pL\pN][-\w]*))$  

https://regex101.com/r/HTqoaT/1

Stringed:

"(?im)^(?=.{1,64}@)(?:(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"@)|((?:[\\pL\\pN](?:\\.(?!\\.)|[-!#\\$%&'\\*\\+/=\\?\\^`\\{\\}\\|~\\w])*)?[\\pL\\pN]@))(?=.{1,255}$)(?:(\\[(?:\\d{1,3}\\.){3}\\d{1,3}\\])|((?:(?=.{1,63}\\.)[\\pL\\pN][-\\w]*[\\pL\\pN]*\\.)+[\\pL\\pN](?:[\\pL\\pN]|-){0,22}[\\pL\\pN])|((?=.{1,63}$)[\\pL\\pN][-\\w]*))$"
0 голосов
/ 15 июня 2019

Я принял предложение Тома и сделал его очень простым.Я немного изменил его, чтобы предотвратить два знака @.

 "[^@]+@.+\\..+"


public class Tmp {
    public static void main(String[] argv) throws AddressException {
        String REGEX1 = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
        String REGEX2 = "[^@]+@.+\\..+";
        String foreignEmail = "cow牛@yahoo.com";
        String hyphenEmail = "games@butterfly-effected.com";
        boolean valid = foreignEmail.matches(REGEX1);
        System.out.println(valid);
        valid = hyphenEmail.matches(REGEX1);
        System.out.println(valid);
//      InternetAddress ia = new InternetAddress("cow牛@yahoo.com");
        System.out.println(foreignEmail.matches(REGEX2));
        System.out.println(hyphenEmail.matches(REGEX2));

    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...