你用過 *.tmp 查找臨時文件?用過編輯器「查找/替換」?它們本質都是正則表達式。正則提供強大字符串處理能力:
兩大核心類:
流程:Pattern.compile(regex) → pattern.matcher(input) → matcher.find()/matches()/lookingAt()
| 元字符 | 含義 | 等價字符類 |
|---|---|---|
\d | 數字 | [0-9] |
\D | 非數字 | [^0-9] |
\s | 空白字符 | [ \t\n\x0B\f\r] |
\S | 非空白 | [^ \t\n\x0B\f\r] |
\w | 單詞字符 | [a-zA-Z_0-9] |
\W | 非單詞字符 | [^a-zA-Z_0-9] |
. | 任意字符 (含換行需 DOTALL 模式) | - |
^ | 行首 / [^...] 否定字符類 | - |
$ | 行尾 | - |
| | 或 | - |
[...] | 字符類 (單字符) | - |
(...) | 分組捕獲 | - |
String str = "aaabcefgABC";
String regex = "aaa|fff";
Pattern p = Pattern.compile(regex); // 或 Pattern.CASE_INSENSITIVE 忽略大小寫
Matcher m = p.matcher(str);
boolean found = m.find(); // 掃描尋找下一匹配
// m.matches() - 整串匹配
// m.lookingAt() - 從開頭匹配
從完整路徑提取文件名:
String regex = ".+\\\\(.+)$"; // 最後一個反斜杠後的內容到行尾
String str = "c:\\dir1\\dir2\\name.txt";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.find()) {
for (int i = 1; i <= m.groupCount(); i++) {
System.out.println(m.group(i)); // group(0) 是整個匹配
}
}
// 輸出: name.txt
String regex = "::";
Pattern p = Pattern.compile(regex);
String[] parts = p.split("xd::abc::cde");
// 等價於 "xd::abc::cde".split("::");
// 結果: ["xd", "abc", "cde"]
String regex = "a+"; // 一個或多個 a
Matcher m = p.matcher("aaabbcedaccdeaa");
String replaced = m.replaceAll("A"); // "AbbcedAccdeA"
String deleted = m.replaceAll(""); // "bbced ccde" (刪除所有 a 序列)
str.split(regex)str.replaceAll(regex, replacement)str.matches(regex) (整串匹配)CASE_INSENSITIVE、MULTILINE (^/$ 匹配行)、DOTALL (. 匹配換行)、UNICODE_CASE* + ? (貪婪)、*? +? ?? (勉強)、*+ ++ ?+ (佔有,不回溯)\b (單詞邊界)、\B (非單詞邊界)、\A (字符串開頭)、\z (字符串結尾)掌握 Pattern/Matcher 核心協作模式,配合豐富語法元素,即可輕鬆應對 Java 中 95% 的字符串處理需求。