JDK 1.4 引入 java.util.regex 包,核心類:
Pattern:正則表達式編譯後的模式Matcher:針對輸入字符串的匹配引擎
String str = "abc efg ABC";
String regEx = "[af]"; // 匹配 a 或 f
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
boolean found = m.find(); // true
// 忽略大小寫
Pattern p2 = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
關鍵方法:find()(部分匹配)、matches()(全字符串匹配)、lookingAt()(前綴匹配)
String regEx = ".+(.+)$"; // 最後一個分組
String str = "c:/dir1/dir2/name.txt";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
if (m.find()) {
for (int i = 1; i <= m.groupCount(); i++) {
System.out.println("Group " + i + ": " + m.group(i));
}
}
// 輸出: name.txt
分組編號規則:0 為整個匹配,1 起為捕獲組,按左括號順序編號
// 方式一:Pattern.split
String regEx = "::";
String[] parts = Pattern.compile(regEx).split("xd::abc::cde");
// 結果: ["xd", "abc", "cde"]
// 方式二:String.split(內部同樣使用 Pattern)
String str = "xd::abc::cde";
String[] parts2 = str.split("::"); // 更簡潔
注意:分割正則中的特殊字符需轉義,如 split("\\|")
String regEx = "a+"; // 連續一個或多個 a
Matcher m = Pattern.compile(regEx).matcher("aaabbced a ccdeaa");
// 替換為大寫 A
String replaced = m.replaceAll("A");
// 結果: "Abbced A ccdeA"
// 刪除匹配內容
String deleted = m.replaceAll("");
// 結果: "bbced ccde"
進階替換:replaceFirst() 替換首個、appendReplacement()/appendTail() 構建複雜替換邏輯
| 元字符 | 等價類別 | 含義 |
|---|---|---|
| \d | [0-9] | 數字 |
| \D | [^0-9] | 非數字 |
| \s | [\t\n\r\f] | 空白字符 |
| \S | [^\t\n\r\f] | 非空白字符 |
| \w | [a-zA-Z_0-9] | 單詞字符 |
| \W | [^a-zA-Z_0-9] | 非單詞字符 |
| . | [^\n] | 除換行外任意字符 |
^:行首(多行模式下)$:行尾(多行模式下)\b:單詞邊界\A:字符串開頭\z:字符串結尾(?:...) 不捕獲,減少內存開銷.*、.+,優先用具體字符類^pattern$ 可大幅提速
// 郵箱驗證
String emailRegex = "^[\\w.-]+@[\\w-]+(\\.[\\w-]+)+$";
// 手機號(中國大陸)
String phoneRegex = "^1[3-9]\\d{9}$";
// IP 地址
String ipRegex = "^((25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d?\\d)$";
// 日期 YYYY-MM-DD
String dateRegex = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$";
正則表達式是文本處理的瑞士軍刀,掌握四大核心功能配合常用模式,能解決 90% 的字符串解析需求。