需驗證 (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);
缺點:國際格式千變萬化,維護成本極高。
+9740410475(含 + 國碼),資料庫唯一索引、查詢最簡潔。libphonenumber (Google) 自動格式化、驗證、解析各國號碼。digits.length() >= 7 && digits.length() <= 15,避免正則維護地獄。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
電話號碼驗證的核心是正規化為純數字,配合成熟庫處理國際化複雜度,切勿自寫複雜正則硬匹配格式。