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

Java 正則表達式實戰(一):Jakarta-ORO 庫完整指南

     編輯:Java 相關知識

正則表達式:字符數據處理的利器

正則表達式由普通字符與元字符組成文字模式,描述待匹配字符串。在字符數據處理中極重要——判斷數字、驗證 Email、海量文本提取數據,不用正則代碼又長又易錯。作者深有體會:整理工具書電子檔,懂正則輕鬆事半功倍,不懂則痛苦不堪。

Java 正則支持歷程

  • JDK 1.3 及之前:無內建庫,依賴第三方(開源或付費)
  • JDK 1.4 測試版:內建 java.util.regex
  • 現狀:多種選擇,本文介紹兩代表性庫——Jakarta-ORO(作者長期使用)與 java.util.regex

Jakarta-ORO 簡介

最全面優化的正則 API 之一,前身 OROMatcher,Daniel F. Savarese 編寫後贈與 Jakarta Project。完全兼容 Perl 5 正則語法。可在 Apache.org 下載。

核心對象體系

1. PatternCompiler:編譯入口

PatternCompiler compiler = new Perl5Compiler();

Perl5Compiler 實現 PatternCompiler 接口,將正則編譯為 Pattern 對象。

2. Pattern:編譯後模式

Pattern pattern = null;
try {
    pattern = compiler.compile("s[ahkl]y");
} catch (MalformedPatternException e) {
    e.printStackTrace();
}

默認大小寫敏感。大小寫不敏感需指定標誌:

pattern = compiler.compile("s[ahkl]y", Perl5Compiler.CASE_INSENSITIVE_MASK);

3. PatternMatcher:匹配執行器

PatternMatcher matcher = new Perl5Matcher();

三大核心匹配方法(參數為輸入字符串):

  • matches(input, pattern):精確匹配整個字符串
  • matchesPrefix(input, pattern):匹配起始部分
  • contains(input, pattern):匹配任意子串(僅首個)

若需查找多個匹配,用 PatternMatcherInput 替代 String,可從上次匹配位置繼續:

boolean matches(PatternMatcherInput input, Pattern pattern)
// 同理 matchesPrefix, contains

4. Util.substitute():替換操作

public static String substitute(PatternMatcher matcher,
    Pattern pattern, Substitution sub, String input, int numSubs)

關鍵第三參數 Substitution 決定替換方式,兩標準實現:

  • StringSubstitution:純文本替換,構造方法 StringSubstitution() / StringSubstitution(String)
  • Perl5Substitution:繼承 StringSubstitution,支持 Perl5 變量插值($1, $2... 對應正則分組)

Perl5Substitution 變量插值深度解析

示例:正則 b(\d+):,替換字符串 "a$1-",輸入 "EXAMPLE b123:" → 輸出 "EXAMPLE a123-"。$1 代表第一分組 (\d+) 匹配內容 "123"。

numInterpolations 參數控制變量更新頻率:

  • INTERPOLATE_ALL:每次匹配更新變量
  • 正整數 N:前 N 次匹配更新,之後固定用第 N 次值

示例:目標 "Tank b123: 85 Tank b256: 32 Tank b78: 22",替換 "a$1-":

  • INTERPOLATE_ALL → "Tank a123- 85 Tank a256- 32 Tank a78- 22"
  • numInterpolations=2 → "Tank a123- 85 Tank a256- 32 Tank a256- 22"(第三次仍用 256)
  • numInterpolations=1 → "Tank a123- 85 Tank a123- 32 Tank a123- 22"

實戰案例:電子檔資料整理(伊索寓言英語教材)

數據結構:MS SQL Server 表 AESOP,三列 ID(int)、WORD(varchar)、CONTENT(varchar)。CONTENT 格式:

[音標] [詞性] (釋義){(例句1/中文/詞性:詞義) (例句2/...)}

例:['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞:凱文)(Kevin is living in ZhuHai now./凱文現住在珠海/名詞:凱文)}

案例 1:查找單個匹配——提取音標

正則:\[[^]]+\](中括號包含非 ] 字符)。Java 轉義:"\\[[^]]+\\]"。用 contains() 或更合理的 matchesPrefix()(音標在起始位置)。完整 JDBC + Jakarta-ORO 代碼演示,輸出 kevin的音標為['kevin]。若正則用分組 (\[[^]]+\]),可用 group(0) 獲取。

驗證中文匹配問題:舊版 2.0.1 不支持中文,升級 2.0.4 解決。

案例 2:查找多個匹配——提取所有方括號內容

正則:\[[^]]+\],用 PatternMatcherInput 循環 contains(),依次輸出 ['kevin] 和 [名詞]。

案例 3:復雜嵌套提取——解析例句結構

三層正則:

  1. \{.+\}:整個例句部分(大括號)
  2. \([^)]+\):單個例句(小括號)
  3. ([^(]+)/(.+)/(.+):([^)]+):例句四字段(英文/中文/詞性/詞義)

代碼演示:先提大括號內容,再循環提小括號,最後分組提取四字段。輸出兩例句完整結構化數據。

案例 4:查找替換——修改第二個例句

目標:將第二例句替換為新內容。正則:\{(\[^)]+\))(\[^)]+\)\} 即 \{$1$2\},構造 Perl5Substitution("{$1(新例句)}"),Util.substitute() 完成替換,輸出正確結果。

總結與延伸

本文介紹 Jakarta-ORO 對象方法與四大實戰案例。雖簡單但望讀者建立認知,實際工作受啟發。Jakarta 另有一純 Java 库 Regexp(Jonathan Locke 贈與),含完整文檔與調試 Applet,有興趣可下載研究。

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