需求:驗證格式為 01-12345678 的電話號碼。規則如下:
01 或 21-9(非 0)-0-9^0[12][1-9]-\d{8}$
逐段解析:
| 片段 | 含義 |
|---|---|
^ | 字符串開始 |
0 | 字面字符 '0' |
[12] | 字符集:'1' 或 '2' |
[1-9] | 字符範圍:'1' 到 '9' |
- | 字面字符 '-'(連字符) |
\d{8} | 恰好 8 個數字(等價 [0-9]{8}) |
$ | 字符串結束 |
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class PhoneValidator {
// 編譯一次,多次複用,效率更高
private static final Pattern PHONE_PATTERN = Pattern.compile("^0[12][1-9]-\\d{8}$");
public static boolean isValid(String phone) {
if (phone == null) return false;
Matcher matcher = PHONE_PATTERN.matcher(phone);
return matcher.matches();
}
public static void main(String[] args) {
String[] tests = {
"01-12345678", // true
"02-98765432", // true
"01-02345678", // false (第3位為0)
"03-12345678", // false (第2位非1/2)
"01-1234567", // false (不足8位)
"01-123456789", // false (超過8位)
"01-1234567a", // false (含字母)
};
for (String s : tests) {
System.out.printf("%-15s -> %b%n", s, isValid(s));
}
}
}
使用捕獲組:
private static final Pattern PHONE_PATTERN_GROUPS = Pattern.compile("^0([12])([1-9])-(\\d{8})$");
public static void parsePhone(String phone) {
Matcher m = PHONE_PATTERN_GROUPS.matcher(phone);
if (m.matches()) {
String areaCode = "0" + m.group(1); // 01 或 02
String prefix = m.group(2); // 1-9
String number = m.group(3); // 8位號碼
System.out.println("區號:" + areaCode + " 前綴:" + prefix + " 號碼:" + number);
}
}
\d 需寫成 \\d。matcher.find() 而非 matches():前者匹配子串,後者匹配整串。^$ 錨點:導致 abc01-12345678def 也通過驗證。