怎麽快速對DB裏的所有email進行校驗
阿新 • • 發佈:2018-12-07
static 就是 數據庫 sta 程序 結果 invalid esql out
問題
由於業務上的需求,重新改寫了校驗email的正則表達式,同時DB裏又遷移了其他數據庫的數據,現在需要重新對DB裏的所有email再校驗一次,以排除掉不合法的email。
DB裏的數據很多,手動去一個個校驗的做法顯然是不靠譜的,這種機械的重復性操作,自然是要用程序來解決才是最簡易的。
做法
拼接字符串
首先是將DB裏所有的email都拼接成一個字符串,由於用的是PostgreSQL,所以直接使用現有的字符串拼接函數string_agg()
。
具體用法如下:
select string_agg(email, ‘;‘) from cnt_user where is_latest;
大意就是拿到所有的最新版本的用戶的email,以‘;‘作為間隔符,將這些email拼接起來,得到的結果就是:[email protected];[email protected]...
在程序中進行校驗
自己寫一個測試類,把剛剛db查詢到的字符串復制進來,通過String類的split()
將其進行切割成一個String數組,然後遍歷該數組,通過正則表達式去一個個校驗,將那些校驗不通過的email給打印出來。
註意:這種方法不適用於email數量特別多的情況,如果String數組的大小超過3億多,會報內存溢出OutOfMemoryError的錯誤。
大概的思路如下:
/** Regex for single EmailValidator */ public static final String SINGLE_EMAIL_REGEX = "(?:(?:[A-Za-z0-9\\-_@!#$%&‘*+/=?^`{|}~]|(?:\\\\[\\x00-\\xFF]?)|" + "(?:\"[\\x00-\\xFF]*\"))+(?:\\.(?:(?:[A-Za-z0-9\\-_@!#$%&‘*+/=?^`{|}~])|(?:\\\\[\\x00-\\xFF]?)|" + "(?:\"[\\x00-\\xFF]*\"))+)*)@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+" + "(?:(?:[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*)(?:[A-Za-z0-9-]*[A-Za-z0-9])?))"; public static final Pattern SINGLE_EMAIL_REGEX_PATTERN = Pattern.compile(SINGLE_EMAIL_REGEX); ... final String emailString = "******"; //DB裏通過函數拼接起來的email字符串 final String[] emails = emailString.split(";"); for (final String email : emails) { final Matcher matcher = SINGLE_EMAIL_REGEX_PATTERN.matcher(email); if (!matcher.matches()) { System.out.println("The email is invalid: " + email); } }
如果不合法的email有很多的話,還可以通過poi將這些email輸出到一個文檔中。
怎麽快速對DB裏的所有email進行校驗