表單驗證中手機號碼檢核是高頻需求。隨著運營商不斷釋出新號段,舊版正則極易漏判。本文提供支援中國移動、聯通、電信最新號段的 Java 正則實作,並解析規則邏輯,方便依專案需求擴充。
| 運營商 | 號段 | 備註 |
|---|---|---|
| 中國移動 | 134、135、136、137、138、139 | 2G/4G |
| 147、150、151、152、157、158、159、172、178、182、183、184、187、188、195、197、198 | 3G/4G/5G | |
| 1440、1441(物聯網) | 專用網段 | |
| 中國聯通 | 130、131、132、145、146、155、156、166、167、171、175、176、185、186、196 | 2G/3G/4G/5G |
| 140、141(物聯網) | 專用網段 | |
| 中國電信 | 133、149、153、173、174、177、180、181、189、190、191、193、199 | 3G/4G/5G |
| 141(物聯網) | 專用網段 | |
| 廣電 | 192 | 5G 專用 |
| 虛擬運營商 | 162、165、167、170、171 | 轉售號段 |
/**
* 驗證中國大陸手機號碼(支援三大運營商+廣電+虛商最新號段)
* 規則:1開頭 + 第二位3-9任意數字 + 後9位數字 = 共11位
* 優點:覆蓋所有現有號段,新號段無需修改正則即可通過
* 缺點:極少數非手機號(如19999999999)也會通過,但業務層面可接受
*/
private static final String MOBILE_REGEX = "^1[3-9]\\d{9}$";
/**
* 嚴格模式:僅允許已正式分配的號段(需定期維護)
* 適用於金融、實名認證等高安全性場景
*/
private static final String STRICT_MOBILE_REGEX =
"^(?:(?:\\+|00)86)?1" +
"(?:3[\\d]|4[5-9]|5[0-35-9]|6[25-7]|7[0-8]|8[\\d]|9[0-9])\\d{8}$";
public boolean isValidMobile(String mobile) {
if (mobile == null || mobile.length() != 11) return false;
return mobile.matches(MOBILE_REGEX); // 或 STRICT_MOBILE_REGEX
}
private boolean telCheck(String tel) {
// 原文正則:僅覆蓋部分舊號段,已不適用於新號段
Pattern p = Pattern.compile(
"^((13\\d{9}$)|" + // 130-139
"(15[012356789]\\d{8}$)|" + // 150-153,155-159
"(18[0256789]\\d{8}$)|" + // 180,182,185-189
"(147\\d{8})$)" // 147
);
Matcher m = p.matcher(tel);
return m.matches();
}
⚠️ 缺漏號段提醒:原正則遺漏 147 以外的 14x、16x、17x、19x 等大量新號段,實務上請改用上方推薦版本。
@Test
public void testMobileRegex() {
String[] valid = {"13800138000", "15912345678", "18688888888", "19212345678", "17012345678"};
String[] invalid = {"12345678901", "1380013800", "138001380000", "138-0013-8000", "1380013800a"};
for (String s : valid) assertTrue(s + " 應通過", s.matches(MOBILE_REGEX));
for (String s : invalid) assertFalse(s + " 應拒絕", s.matches(MOBILE_REGEX));
}
Pattern 編譯為 static final 常數,避免重複編譯Pattern.compile(regex, Pattern.CASE_INSENSITIVE) 預編譯libphonenumber (Google 開源庫) 實現國際化、格式化、歸屬地查詢等進階功能採用 ^1[3-9]\\d{9}$ 通用正則可覆蓋 99%+ 實際業務場景,維護成本極低;高安全性系統建議搭配 libphonenumber 庫或定期更新嚴格正則。切勿沿用多年前舊版正則,以免誤攔合法用戶。