首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 正則實戰:精準提取專利分類文本(含點號與無點號格式)

     編輯:程式設計疑難解答

處理專利、法律條文等半結構化文本時,常需從「代碼+描述」混合行中提取特定段落。本文以真實專利分類數據為例,演示如何用 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]匹配第一個中文字符(描述內容起始點)
.*貪婪匹配剩餘所有字符至行尾

完整 Java 代碼

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)

進階技巧與避坑

  1. 捕獲組提取純描述: 若只要中文描述,改用 \\s\\d{2}/\\d{2}\\.?([\\u4e00-\\u9fa5].*) 並取 m.group(1)。
  2. 處理多行文本: 加 Pattern.DOTALL 或 (?s) 讓 . 匹配換行符。
  3. 效能優化: 預編譯 Pattern、避免在循環中重複編譯、長文本用 Matcher.find() 迭代而非 matches()。
  4. 邊界情況: 若分類號後直接是數字或符號非中文,需調整字符類 [\\u4e00-\\u9fa5] 為 [^\\s] 或具體業務字符集。

正則可視化調試工具推薦

  • Regex101:支援 Java 語法、實時高亮、解釋面板。
  • RegExper:生成正則鐵路圖,適合複雜表達式文檔化。
  • IDE 內建:IntelliJ IDEA Ctrl+Alt+R 正則檢查器、VS Code 擴展 Regex Previewer。

掌握「非貪婪定位邊界 + 業務關鍵字符類」組合拳,即可應對大多數半結構化文本提取需求。下次遇到類似「代碼+描述」混排數據,試試這套思路。

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