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

Java 正則提取字符串前 8 個數字:去非數字後截取

     編輯:程式設計疑難解答

需求

輸入如 "2016-01-13 10:09:24",提取前 8 個數字 → "20160113"。

方案一:正則替換非數字 + substring (最通用、易懂)


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
}

方案三:SimpleDateFormat 解析格式化 (最語義化、魯棒性強)


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 解析格式化**,語義正確且自帶合法性校驗。避免寫複雜正則分組捕獲,維護成本高且易出錯。

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