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

Java 正則表達式實戰:分割、匹配、替換、提取完整範例

     編輯:Java 程式設計入門

核心類別速覽

  • Pattern:編譯後的正則模式,執行緒安全,可重複使用
  • Matcher:針對輸入字串執行匹配操作的引擎

四大經典場景實戰

1. 字串分割

String html = "<html><head><title>regex test</title></head><body><p>this is a simle regex test</p></body></html>";
// 以 < / > 作為分隔符
String[] parts = Pattern.compile("[</?|>]").split(html);
for (String p : parts) {
    System.out.print(p + " ");
}

輸出: html head title regex test /title /head body p this is a simle regex test /p /body /html

2. 整體匹配驗證

// 驗證整個字串是否符合「標籤成對巢狀」模式
boolean matched = Pattern.compile("^<(\\w*)>.*</\\1>$").matcher(html).matches();
System.out.println(matched); // false(實際 HTML 結構更複雜)

說明:\\1 為反向引用,對應第一個捕獲組 (\\w*),確保開合標籤名稱一致。

3. 字串替換

// 將所有 <p> 和 </p> 替換為 <h1> 和 </h1>
String replaced = Pattern.compile("<(/?)p>").matcher(html).replaceAll("<$1h1>");
System.out.println(replaced);

關鍵點: $1 保留捕獲組內容(即可選的 /),實現開合標籤同步替換。

4. 內容提取

Matcher m = Pattern.compile("<title>(.*)</title>").matcher(html);
while (m.find()) {
    System.out.println(m.group(1)); // 輸出:regex test
}

group(1) 取得第一個捕獲組內容,比 group(0)(整個匹配)更實用。

效能優化提醒

  • 預編譯 Pattern:靜態常量或建構子中編譯一次,避免重複編譯開銷
  • 優先使用具體字符類:如 [<>] 優於 .,減少回溯
  • 避免貪婪量詞過度:.*? 非貪婪模式常比 .* 更高效

完整測試類別

package com.hongyuan.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {
    public static void main(String[] args) {
        String str = "<html><head><title>regex test</title></head><body><p>this is a simle regex test</p></body></html>";

        // 1. 分割
        String[] splitStr = Pattern.compile("[</?|>]").split(str);
        for (String s : splitStr) System.out.print(s + " ");
        System.out.println();

        // 2. 整體匹配
        boolean isMatching = Pattern.compile("^<(\\w*)>.*</\\1>$").matcher(str).matches();
        System.out.println("整體匹配: " + isMatching);

        // 3. 替換
        String repStr = Pattern.compile("<(/?)p>").matcher(str).replaceAll("<$1h1>");
        System.out.println("替換後: " + repStr);

        // 4. 提取
        Matcher m = Pattern.compile("<title>(.*)</title>").matcher(str);
        while (m.find()) {
            System.out.println("標題內容: " + m.group(1));
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved