繁体   English   中英

在哪里可以找到用于电子邮件验证外来字符 (RFC 6530) 的 Java 正则表达式?

[英]Where can I find a Java regular expression for email validation of foreign characters (RFC 6530)?

我尝试过emailregex.com并使用了他们的 Java 正则表达式,但对于国际字符却失败了。 我还在regexr.com上测试了 RFC 标准正则表达式。 我需要一个正则表达式来验证以下所有内容:

  • 牛牛@yahoo.com
  • 电子邮件@example.com
  • user@butterfly-effect.com

我知道正则表达式不可能捕获 100% 的电子邮件,但我需要包含国际字符。 哦, 电子邮件地址中允许使用国际字符

我最初有这个( https://stackoverflow.com/a/26989421/148844 ),但它无法验证带连字符的域。

我试过:

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

但它扔了

javax.mail.internet.AddressException: 地址中的非法字符 (cow牛@yahoo.com,3)

我尝试在互联网上搜索,但没有找到相关结果。

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

如果您为此正则表达式打开 Unicode,它将匹配
国际字字符。 基本上,字母数字,但不是标点符号。

这是 RFC5322 正则表达式,其中[a-zA-Z0-9]替换为[^\\W_]
它引入了\\w构造,当在 Unicode 中使用时,它会扩展
允许的字母数字。

生的:

(?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

弦:

"(?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 个字符。

生的:

(?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

弦:

"(?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]*))$"

我接受了@Tom 的建议,让它变得非常简单。 我稍微修改了它以防止出现两个@ 符号。

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


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));

    }


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM