[英]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.