處理專利、法律條文等半結構化文本時,常需從「代碼+描述」混合行中提取特定段落。本文以真實專利分類數據為例,演示如何用 Java 正則表達式精準截取目標內容,並解析關鍵正則邏輯。
A61K 33/00含無機有效成分的醫用 (2)
A61K 33/02.氨;其化合物 (2)
A61K 33/08..氧化物;其化合物 (2)
需保留紅框部分: 從分類號後的第一個中文字符開始,到行尾(含括號編號)。
.*?\\s\\d{2}/\\d{2}\\.?[\\u4e00-\\u9fa5].*
| 片段 | 含義 |
|---|---|
.*? | 非貪婪匹配任意字符(匹配開頭的 A61K 等前綴) |
\\s | 匹配一個空白字符(分隔符) |
\\d{2}/\\d{2} | 匹配 33/00、33/02 等分類主組/子組編號 |
\\.? | 匹配 0 或 1 個點號(兼容 33/02. 與 33/00 兩種格式) |
[\\u4e00-\\u9fa5] | 匹配第一個中文字符(描述內容起始點) |
.* | 貪婪匹配剩餘所有字符至行尾 |
import java.util.*;
import java.util.regex.*;
public class PatentExtractor {
public static void main(String[] args) {
List<String> items = Arrays.asList(
"A61K 33/00含無機有效成分的醫用 (2)",
"A61K 33/02.氨;其化合物 (2)",
"A61K 33/08..氧化物;其化合物 (2)"
);
Pattern pattern = Pattern.compile(".*?\\\\s\\\\d{2}/\\\\d{2}\\\\.?[\\\\u4e00-\\\\u9fa5].*");
for (String line : items) {
Matcher m = pattern.matcher(line);
if (m.find()) {
System.out.println(m.group());
}
}
}
}
33/00含無機有效成分的醫用 (2)
33/02.氨;其化合物 (2)
33/08..氧化物;其化合物 (2)
\\s\\d{2}/\\d{2}\\.?([\\u4e00-\\u9fa5].*) 並取 m.group(1)。Pattern.DOTALL 或 (?s) 讓 . 匹配換行符。Pattern、避免在循環中重複編譯、長文本用 Matcher.find() 迭代而非 matches()。[\\u4e00-\\u9fa5] 為 [^\\s] 或具體業務字符集。Ctrl+Alt+R 正則檢查器、VS Code 擴展 Regex Previewer。掌握「非貪婪定位邊界 + 業務關鍵字符類」組合拳,即可應對大多數半結構化文本提取需求。下次遇到類似「代碼+描述」混排數據,試試這套思路。