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

Java 正則表達式完整指南:從入門語法到實戰應用

     編輯:Java 相關知識

為什麼需要正則表達式?

在軟體開發中,字串比對、搜尋、替換、驗證是家常便飯。若純靠手寫邏輯處理複雜字串模式,不僅程式碼冗長難維護,更極易出錯。Java 自 JDK 1.4 引入 java.util.regex 套件,提供強大、標準化的正則引擎,讓開發者能以宣告式語法輕鬆解決棘手的字串處理問題。

核心語法速查表

常用轉義字元與字元類別

符號說明等價表示
\t定位符\u0009
\n換行\u000A
\d數字[0-9]
\D非數字[^0-9]
\s空白字元[\t\n\x0B\f\r]
\w單字字元[a-zA-Z_0-9]
\b單字邊界-

錨點與量詞

  • ^:字串開頭(多行模式下為行首)
  • $:字串結尾(多行模式下為行尾)
  • .:任意單一字元(預設不含換行)
  • *:零次或多次
  • +:一次或多次
  • ?:零次或一次
  • {n}:恰好 n 次
  • {n,}:至少 n 次
  • {n,m}:n 到 m 次

字元類別與群組

[abc]      // a 或 b 或 c
[a-z]      // 小寫字母
[^abc]     // 非 a、b、c
(abc)      // 捕獲群組
(?:abc)    // 非捕獲群組
a|b        // a 或 b

Pattern 編譯旗標

Pattern.compile(regex, flags) 常用旗標:

旗標常數效果
iCASE_INSENSITIVE忽略大小寫(預設僅 ASCII)
uUNICODE_CASE配合 i 旗標支援 Unicode 大小寫
mMULTILINE^/$ 匹配行首尾
sDOTALL. 匹配含換行在內任意字元
xCOMMENTS忽略模式中的空白與註解
dUNIX_LINES僅 \n 視為行結束

實戰範例精選

1. 字串驗證:以 "Java" 開頭

Pattern p = Pattern.compile("^Java.*");
Matcher m = p.matcher("Java不是人");
System.out.println(m.matches()); // true

2. 多條件分割字串

String[] parts = Pattern.compile("[,|\\s]+")
    .split("Java Hello World Java,Hello,,World|Sun");
// 結果: [Java, Hello, World, Java, Hello, World, Sun]

3. 字串替換:首次/全部/自訂邏輯

String input = "正則表達式 Hello, 正則表達式 World";
Pattern p = Pattern.compile("正則表達式");
Matcher m = p.matcher(input);

System.out.println(m.replaceFirst("Java"));     // 替換首次
System.out.println(m.replaceAll("Java"));       // 替換全部

// 進階:StringBuffer 逐個替換
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "Java");
}
m.appendTail(sb);
System.out.println(sb);

4. Email 格式驗證

String email = "user@example.com.cn";
Pattern p = Pattern.compile("[\\w.-]+@([\\w-]+\\.)+[\\w-]+", Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher(email).matches()); // true

5. 移除 HTML 標籤

String html = "首頁";
String text = Pattern.compile("<.+?>", Pattern.DOTALL)
    .matcher(html)
    .replaceAll("");
// 結果: 首頁

6. 擷取 HTML 屬性值

Pattern p = Pattern.compile("href=\"(.+?)\"");
Matcher m = p.matcher("首頁");
if (m.find()) System.out.println(m.group(1)); // index.html

7. 擷取 URL

Pattern p = Pattern.compile("(https?://)[\\w./:-]+");
Matcher m = p.matcher("訪問 https://example.com/path?q=1 吧");
while (m.find()) System.out.println(m.group()); // https://example.com/path?q=1

8. 模板字串替換 {0}, {1}...

String template = "Java發展史: {0}年-{1}年";
String[][] params = {{"\\{0\\}", "1995"}, {"\\{1\\}", "2007"}};

String result = template;
for (String[] kv : params) {
    result = Pattern.compile(kv[0]).matcher(result).replaceAll(kv[1]);
}
System.out.println(result); // Java發展史: 1995年-2007年

9. 依正則尋找檔案

public class FileFinder {
    private final List<File> files = new ArrayList<>();
    
    public void find(String dirPath, String regex) {
        File dir = new File(dirPath);
        File[] matched = dir.listFiles(f -> Pattern.matches(regex, f.getName()));
        if (matched != null) Collections.addAll(files, matched);
    }
    
    public void print() {
        files.forEach(f -> System.out.println(f.getPath()));
    }
    
    public static void main(String[] args) {
        new FileFinder().find("C:/", "[A-Za-z.]+").print();
    }
}

效能提醒與最佳實務

  • 預編譯 Pattern:Pattern 為執行緒安全,重複使用可避免重複編譯開銷。
  • 善用非捕獲群組:(?:...) 減少記憶體佔用。
  • 避免過度嵌套量詞:如 (a+)+ 易導致災難性回溯。
  • 具體化字元類別:[a-z] 比 . 快且精確。
  • 錨點優化:^pattern$ 可快速失敗非目標字串。

總結

正則表達式是字串處理的瑞士刀,Java 的 java.util.regex 提供完整、高效能的實作。掌握核心語法、旗標與 Pattern/Matcher API,配合預編譯與防災難性回溯技巧,即能優雅解決 90% 以上的字串比對需求。建議收藏本文語法表,實戰中查閱最效率。

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