輸入如 "2016-01-13 10:09:24",提取前 8 個數字 → "20160113"。
String str = "2016-01-13 10:09:24";
// 1. 移除所有非數字字符
String digitsOnly = str.replaceAll("\\D", ""); // \\D = [^0-9]
// 2. 取前 8 位
String result = digitsOnly.substring(0, Math.min(8, digitsOnly.length()));
System.out.println(result); // 20160113
String str = "2016-01-13 10:09:24";
// 匹配開頭連續的數字/非數字混合,捕獲前 8 個數字
// 實際較複雜,不如方案一直觀
Pattern p = Pattern.compile("(\\d{4})\\D(\\d{2})\\D(\\d{2})"); // 針對 yyyy-MM-dd
Matcher m = p.matcher(str);
if (m.find()) {
String result = m.group(1) + m.group(2) + m.group(3); // 20160113
}
String str = "2016-01-13 10:09:24";
try {
SimpleDateFormat inputFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = inputFmt.parse(str);
SimpleDateFormat outputFmt = new SimpleDateFormat("yyyyMMdd");
String result = outputFmt.format(date); // 20160113
} catch (ParseException e) {
// 格式不匹配處理
}
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| replaceAll("\\D","") + substring | **通用、不依賴格式、代碼極短** | 若字符串前 8 數字非日期語義 (如訂單號混雜) 也會提取 | **通用提取前 N 個數字**,格式多變/未知 |
| 正則分組捕獲 | 精確控制提取位置 | 寫死格式、維護難、正則易錯 | 固定格式且需提取特定段 |
| SimpleDateFormat 解析格式化 | **語義正確、自動校驗日期合法性、時區安全** | 需知道輸入格式、拋異常需捕獲 | **輸入確定為日期時間字符串**,需語義轉換 |
public static String extractFirstNDigits(String input, int n) {
if (input == null) return "";
String digits = input.replaceAll("\\D", "");
return digits.length() >= n ? digits.substring(0, n) : digits;
}
// 使用
String datePart = extractFirstNDigits("2016-01-13 10:09:24", 8); // 20160113
String orderPrefix = extractFirstNDigits("ORD-20231105-001", 8); // 20231105
提取字符串前 8 個數字,最通用最簡潔:str.replaceAll("\\D", "").substring(0, 8)。 若輸入確為日期字符串,**首選 SimpleDateFormat 解析格式化**,語義正確且自帶合法性校驗。避免寫複雜正則分組捕獲,維護成本高且易出錯。