首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 正則表達式完整教程:Pattern/Matcher 核心 API、常用語法、提取/分割/替換實戰

     編輯:Java 程式設計入門

正則表達式能做什麼?

  • 模式匹配驗證:手機號、身份證、郵箱、URL 格式校驗
  • 文本替換/刪除:敏感詞過濾、格式標準化
  • 信息提取:從日志/網頁/文檔中抓取特定字段
  • 字符串分割:複雜分隔符解析(CSV、日志行、協議報文)

JDK 1.4+ 引入 java.util.regex 包,String.replaceAll/split 內部均委託該包實現。

核心類:Pattern 與 Matcher

Pattern——編譯後的正則模式(線程安全、可復用)

Pattern p = Pattern.compile(regex);           // 編譯
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); // 忽略大小寫
Matcher m = p.matcher(input);                   // 創建匹配器

Matcher——匹配引擎(非線程安全)

  • matches():整個輸入序列完全匹配
  • lookingAt():從開頭開始匹配
  • find():掃描尋找下一個匹配子串(最常用)
  • 匹配成功後:group() 獲取整組,group(i) 獲取第 i 個捕獲組,groupCount() 組數

常用字符類與元字符速查

符號含義等價
\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)—
^行首(MULTILINE 模式)—
$行尾(MULTILINE 模式)—
[abc]單字符集合—
[^abc]排除字符集合—
(...)捕獲組—
(?:...)非捕獲組—

四大核心操作實戰

1. 字符串匹配/查找

String str = "aaabc efg ABC";
String regex = "aaa";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(str);
boolean found = m.find(); // true
// 循環查找所有匹配
while (m.find()) {
    System.out.println("位置:" + m.start() + "-" + m.end() + " 內容:" + m.group());
}

2. 提取子串(捕獲組)

// 從完整路徑提取文件名
String regex = ".+[/\\\\](.+)$"; // 兼容 Windows/Linux 分隔符
String path = "c:/dir1/dir2/name.txt";
Matcher m = Pattern.compile(regex).matcher(path);
if (m.find()) {
    System.out.println(m.group(1)); // 輸出:name.txt
}

3. 分割字符串

// 方式一:Pattern.split
String[] parts = Pattern.compile("::").split("xd::abc::cde");
// 方式二:String.split(內部同樣用 Pattern)
String[] parts2 = "xd::abc::cde".split("::");
// 結果:[xd, abc, cde]

4. 替換/刪除

String input = "aaabbced a ccdeaa";
String regex = "a+"; // 連續一個或多個 a
String replaced = Pattern.compile(regex).matcher(input).replaceAll("A");
// 結果:"Abbced A ccdeA"

// 刪除:替換為空串
String deleted = Pattern.compile(regex).matcher(input).replaceAll("");
// 結果:"bbced ccde"

進階技巧

  • 貪婪/勉強/佔有量詞:* + ? (貪婪) / *? +? ?? (勉強) / *+ ++ ?+ (佔有,不回溯)
  • 邊界斷言:\b 單詞邊界、\A 字符串開頭、\z 字符串結尾
  • 前瞻/後顧:(?=...) 正向前瞻、(?!...) 負向前瞻、(?<=...) 正向後顧、(? 負向後顧
  • 內嵌標誌位:(?i) 忽略大小寫、(?m) 多行、(?s) DOTALL
  • 預編譯復用:正則為常量時靜態預編譯 private static final Pattern EMAIL = Pattern.compile(...),避免重複編譯開銷

性能與避坑提示

  1. 避免災難性回溯:(a+)+ 匹配 aaaaaaaaaaaa! 會指數級回溯,改用佔有量詞 (a++)+ 或原子組 (?>a+)+
  2. 大文本處理用 find() 迭代而非 matches()
  3. 頻繁調用的正則務必預編譯為 Pattern 常量
  4. Java 9+ Matcher.replaceAll(Function) 支持函數式替換邏輯

總結

掌握 Pattern/Matcher 雙核模型、捕獲組提取、分割替換四大核心操作,配合常用字符類速查表,即可應對 90%+ 的文本處理場景。進階時關注回溯陷阱、預編譯復用、Java 9+ 新 API,將正則從「寫時讀懂、改時崩潰」轉化為可維護的文本處理利器。

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