首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

正則表達式驗證帶格式電話號碼:預處理移除非數字字元再驗證

     編輯:程式設計綜合問答

問題現象

需驗證 (974) 041-0475 格式號碼,嘗試正則 ^+(?:[0-9] ?){6,14}[0-9]$ 失敗。原因:正則針對純數字設計,無法匹配括號、空格、連字號等格式字元。

解決策略:預處理 + 純數字驗證

步驟一:移除所有非數字字元


// Java
String normalized = phone.replaceAll("\\D", "");  // 保留數字
// 結果:9740410475

步驟二:驗證純數字長度與規則


// 國際號碼:國家碼(1-3位) + 區域碼/用戶號(6-14位),總長 7-15 位
boolean valid = normalized.matches("^\\d{7,15}$");
// 或更嚴格:E.164 格式(含國碼,不含 +)
// valid = normalized.matches("^[1-9]\\d{6,14}$");

完整驗證方法


public boolean isValidPhone(String phone) {
    if (phone == null) return false;
    String digits = phone.replaceAll("\\D", "");
    // 允許 7-15 位數字(涵蓋國內/國際)
    return digits.matches("^\\d{7,15}$");
}

進階:保留格式的嚴格匹配(不推薦)

若必須驗證具體格式 (XXX) XXX-XXXX:


String usPattern = "^\\(\\d{3}\\)\\s?\\d{3}-\\d{4}$";
boolean valid = phone.matches(usPattern);

缺點:國際格式千變萬化,維護成本極高。

最佳實踐建議

  1. 儲存統一為 E.164 格式:+9740410475(含 + 國碼),資料庫唯一索引、查詢最簡潔。
  2. 輸入端即時格式化:使用 libphonenumber (Google) 自動格式化、驗證、解析各國號碼。
  3. 後端僅驗證數字長度:digits.length() >= 7 && digits.length() <= 15,避免正則維護地獄。
  4. 顯示端按地區格式化:同樣用 libphonenumber 格式化輸出。

Google libphonenumber 範例


// Maven
implementation "com.googlecode.libphonenumber:libphonenumber:8.13.2"

// 使用
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
PhoneNumber number = util.parse(phone, "US");  // 預設地區
boolean valid = util.isValidNumber(number);
String e164 = util.format(number, PhoneNumberFormat.E164);  // +14155552671
String national = util.format(number, PhoneNumberFormat.NATIONAL);  // (415) 555-2671

電話號碼驗證的核心是正規化為純數字,配合成熟庫處理國際化複雜度,切勿自寫複雜正則硬匹配格式。

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