首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 手機號碼驗證正則表達式(支援三大運營商最新號段)

     編輯:Java 相關知識

表單驗證中手機號碼檢核是高頻需求。隨著運營商不斷釋出新號段,舊版正則極易漏判。本文提供支援中國移動、聯通、電信最新號段的 Java 正則實作,並解析規則邏輯,方便依專案需求擴充。

最新運營商號段總覽(2024 更新)

運營商號段備註
中國移動134、135、136、137、138、1392G/4G
147、150、151、152、157、158、159、172、178、182、183、184、187、188、195、197、1983G/4G/5G
1440、1441(物聯網)專用網段
中國聯通130、131、132、145、146、155、156、166、167、171、175、176、185、186、1962G/3G/4G/5G
140、141(物聯網)專用網段
中國電信133、149、153、173、174、177、180、181、189、190、191、193、1993G/4G/5G
141(物聯網)專用網段
廣電1925G 專用
虛擬運營商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 庫或定期更新嚴格正則。切勿沿用多年前舊版正則,以免誤攔合法用戶。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved