1. 提取純數字 (移除非數字)
String input = "哈哈,13888889999";
String digitsOnly = input.replaceAll("[^0-9]", "");
System.out.println(digitsOnly); // 13888889999
// 等價 Pattern 寫法
Pattern p = Pattern.compile("[^0-9]");
Matcher m = p.matcher(input);
String result = m.replaceAll("");
2. 移除數字 (保留非數字)
String input = "張三 13599998888 000000";
String noDigits = input.replaceAll("\\d", "");
System.out.println(noDigits.trim()); // 張三
// 等價
Pattern p = Pattern.compile("\\d");
Matcher m = p.matcher(input);
String result = m.replaceAll("").trim();
3. 提取連續數字段 (保留分隔)
String input = "訂單2023001金額123.45元";
Pattern p = Pattern.compile("\\d+(\\.\\d+)?");
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println(m.group()); // 2023001, 123.45
}
4. 替換數字為固定標記
String masked = input.replaceAll("\\d", "*");
// 或保留長度
String maskedLen = input.replaceAll("\\d", m -> "*".repeat(m.group().length()));
5. 編譯複用 Pattern (高頻調用)
// 靜態常量編譯一次
private static final Pattern DIGIT_PATTERN = Pattern.compile("\\d");
private static final Pattern NON_DIGIT_PATTERN = Pattern.compile("[^0-9]");
public static String extractDigits(String s) {
return NON_DIGIT_PATTERN.matcher(s).replaceAll("");
}
public static String removeDigits(String s) {
return DIGIT_PATTERN.matcher(s).replaceAll("");
}
6. 正則元字符速查
| 符號 | 含義 |
| \d | [0-9] 數字 |
| \D | [^0-9] 非數字 |
| \w | [a-zA-Z0-9_] 單詞字符 |
| \W | [^a-zA-Z0-9_] |
| \s | 空白字符 |
| . | 任意字符 (除換行) |
| * + ? | 0或多 / 1或多 / 0或1 |
| () | 捕獲組 |
7. 效能提示
String.replaceAll 內部每次編譯 Pattern,高頻請手動編譯複用。
- 大量文本處理考慮
Matcher.find() 迭代而非 replaceAll。
- 避免災難性回溯:慎用
(.*)、嵌套量詞,改用佔有優先 .*? 或原子組。