簡體   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