java.util.regex 以正則表達式編譯模式對字符串匹配。兩大核心類:
流程:Pattern.compile(regex) → pattern.matcher(input) 得到 Matcher → 匹配操作。多個 Matcher 可共用一個 Pattern。
| 方法 | 說明 |
|---|---|
static Pattern compile(String regex) | 編譯正則表達式 |
static Pattern compile(String regex, int flags) | 帶標誌編譯:CASE_INSENSITIVE, MULTILINE, DOTALL, UNICODE_CASE, CANON_EQ |
int flags() | 返回匹配標誌 |
Matcher matcher(CharSequence input) | 生成 Matcher 對象 |
static boolean matches(String regex, CharSequence input) | 一次性編譯匹配,適合單次使用 |
String pattern() | 返回編譯的正則表達式 |
String[] split(CharSequence input) | 按模式分割字符串 |
String[] split(CharSequence input, int limit) | 分割並限制段數 |
Pattern p = Pattern.compile("[/]+");
String[] result = p.split("Kevin.../凱文.../名詞:凱文。");
// 結果三段
// 限制兩段
String[] result2 = p.split("Kevin.../凱文.../名詞:凱文。", 2);
// 結果兩段,第二段含剩餘內容
對比 Jakarta-ORO:java.util.regex 只需 Pattern.compile(),更簡潔易懂。
matches():整個目標字符串完全匹配才返回 truelookingAt():檢測目標字符串是否以匹配子串起始find() / find(int start):查找下一個匹配子串,可指定起始位置均返回 boolean。
replaceAll(replacement):全部替換replaceFirst(replacement):首次替換appendReplacement(sb, replacement):當前匹配替換並將替換後子串及其之前到上次匹配後的片段加入 StringBufferappendTail(sb):最後一次匹配後剩餘字符串加入 StringBufferappendReplacement + appendTail 經典模式:
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "Kevin"); // 替換並累積
}
m.appendTail(sb); // 處理尾部
// sb 即為完整替換結果
示例:將 "Kelvin" 全部改為 "Kevin",輸出過程清晰展示每次匹配後 sb 內容變化,最終得到正確結果。
group():當前匹配的所有組內容group(int group):指定組內容groupCount():組數量示例:Pattern.compile("(ca)(t)") 匹配 "one cat,two cats...",groupCount()=2,group(1)="ca",group(2)="t"。
public class Email {
public static void main(String[] args) throws Exception {
String input = args[0];
// 1. 不能以 . 或 @ 起始
if (Pattern.compile("^\\.|^\\@").matcher(input).find()) {
System.err.println("EMAIL地址不能以'.'或'@'作為起始字符");
}
// 2. 不能以 www. 起始
if (Pattern.compile("^www\\.").matcher(input).find()) {
System.out.println("EMAIL地址不能以'www.'起始");
}
// 3. 檢測非法字符並清理
Pattern p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
Matcher m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;
while (result) {
deletedIllegalChars = true;
m.appendReplacement(sb, ""); // 刪除非法字符
result = m.find();
}
m.appendTail(sb);
input = sb.toString();
if (deletedIllegalChars) {
System.out.println("輸入包含非法字符,請修改");
System.out.println("當前輸入:" + args[0]);
System.out.println("修改後合法地址類似:" + input);
}
}
}
測試案例:
java Email www.kevin@163.net → 不能以 www. 起始java Email 163.net → 不能以 . 或 @ 起始java Email cgjmail#$%@163.net → 檢出非法字符,清理後為 cgjmail@163.net本文介紹 JDK 1.4 java.util.regex 核心類與方法。結合上篇 Jakarta-ORO 對比,讀者更易掌握。性能持續優化,最新信息請關注 SUN 官網。付費庫非必需,免費優秀庫足矣,有興趣者可自行查找第三方庫。