Pattern:編譯後的正則模式,執行緒安全,可重複使用Matcher:針對輸入字串執行匹配操作的引擎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
// 驗證整個字串是否符合「標籤成對巢狀」模式
boolean matched = Pattern.compile("^<(\\w*)>.*</\\1>$").matcher(html).matches();
System.out.println(matched); // false(實際 HTML 結構更複雜)
說明:\\1 為反向引用,對應第一個捕獲組 (\\w*),確保開合標籤名稱一致。
// 將所有 <p> 和 </p> 替換為 <h1> 和 </h1>
String replaced = Pattern.compile("<(/?)p>").matcher(html).replaceAll("<$1h1>");
System.out.println(replaced);
關鍵點: $1 保留捕獲組內容(即可選的 /),實現開合標籤同步替換。
Matcher m = Pattern.compile("<title>(.*)</title>").matcher(html);
while (m.find()) {
System.out.println(m.group(1)); // 輸出:regex test
}
group(1) 取得第一個捕獲組內容,比 group(0)(整個匹配)更實用。
[<>] 優於 .,減少回溯.*? 非貪婪模式常比 .* 更高效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));
}
}
}