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

怎麽快速對DB裏的所有email進行校驗

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進行校驗