[英]Where can I find a Java regular expression for email validation of foreign characters (RFC 6530)?
我尝试过emailregex.com并使用了他们的 Java 正则表达式,但对于国际字符却失败了。 我还在regexr.com上测试了 RFC 标准正则表达式。 我需要一个正则表达式来验证以下所有内容:
我知道正则表达式不可能捕获 100% 的电子邮件,但我需要包含国际字符。 哦, 电子邮件地址中允许使用国际字符。
我最初有这个( https://stackoverflow.com/a/26989421/148844 ),但它无法验证带连字符的域。
我试过:
InternetAddress ia = new InternetAddress("cow牛@yahoo.com");
但它扔了
javax.mail.internet.AddressException: 地址中的非法字符 (cow牛@yahoo.com,3)
我尝试在互联网上搜索,但没有找到相关结果。
如果您为此正则表达式打开 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.