1. 程式人生 > >怎麼快速對DB裡的所有email進行校驗

怎麼快速對DB裡的所有email進行校驗

問題

由於業務上的需求,重新改寫了校驗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\\
[email protected]
!#$%&'*+/=?^`{|}~]|(?:\\\\[\\x00-\\xFF]?)|" + "(?:\"[\\x00-\\xFF]*\"))+(?:\\.(?:(?:[A-Za-z0-9\\[email protected]!#$%&'*+/=?^`{|}~])|(?:\\\\[\\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輸出到一個文件中。