正則表達式由普通字符與元字符組成文字模式,描述待匹配字符串。在字符數據處理中極重要——判斷數字、驗證 Email、海量文本提取數據,不用正則代碼又長又易錯。作者深有體會:整理工具書電子檔,懂正則輕鬆事半功倍,不懂則痛苦不堪。
java.util.regexjava.util.regex最全面優化的正則 API 之一,前身 OROMatcher,Daniel F. Savarese 編寫後贈與 Jakarta Project。完全兼容 Perl 5 正則語法。可在 Apache.org 下載。
PatternCompiler compiler = new Perl5Compiler();
Perl5Compiler 實現 PatternCompiler 接口,將正則編譯為 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);
PatternMatcher matcher = new Perl5Matcher();
三大核心匹配方法(參數為輸入字符串):
matches(input, pattern):精確匹配整個字符串matchesPrefix(input, pattern):匹配起始部分contains(input, pattern):匹配任意子串(僅首個)若需查找多個匹配,用 PatternMatcherInput 替代 String,可從上次匹配位置繼續:
boolean matches(PatternMatcherInput input, Pattern pattern)
// 同理 matchesPrefix, contains
public static String substitute(PatternMatcher matcher,
Pattern pattern, Substitution sub, String input, int numSubs)
關鍵第三參數 Substitution 決定替換方式,兩標準實現:
StringSubstitution() / StringSubstitution(String)示例:正則 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./凱文現住在珠海/名詞:凱文)}
正則:\[[^]]+\](中括號包含非 ] 字符)。Java 轉義:"\\[[^]]+\\]"。用 contains() 或更合理的 matchesPrefix()(音標在起始位置)。完整 JDBC + Jakarta-ORO 代碼演示,輸出 kevin的音標為['kevin]。若正則用分組 (\[[^]]+\]),可用 group(0) 獲取。
驗證中文匹配問題:舊版 2.0.1 不支持中文,升級 2.0.4 解決。
正則:\[[^]]+\],用 PatternMatcherInput 循環 contains(),依次輸出 ['kevin] 和 [名詞]。
三層正則:
\{.+\}:整個例句部分(大括號)\([^)]+\):單個例句(小括號)([^(]+)/(.+)/(.+):([^)]+):例句四字段(英文/中文/詞性/詞義)代碼演示:先提大括號內容,再循環提小括號,最後分組提取四字段。輸出兩例句完整結構化數據。
目標:將第二例句替換為新內容。正則:\{(\[^)]+\))(\[^)]+\)\} 即 \{$1$2\},構造 Perl5Substitution("{$1(新例句)}"),Util.substitute() 完成替換,輸出正確結果。
本文介紹 Jakarta-ORO 對象方法與四大實戰案例。雖簡單但望讀者建立認知,實際工作受啟發。Jakarta 另有一純 Java 库 Regexp(Jonathan Locke 贈與),含完整文檔與調試 Applet,有興趣可下載研究。