Java正則表達式應用與知識點詳解
一、正則表達式基礎概念
正則表達式(Regular Expression)是通過特定語法規則描述字符串模式的工具,常用于:
- 數據格式驗證
- 文本搜索與替換
- 字符串分割
- 模式匹配提取
Java通過java.util.regex
包提供支持,核心類:
Pattern
:編譯后的正則表達式對象Matcher
:執行匹配操作的引擎PatternSyntaxException
:正則語法異常
二、核心語法詳解
- 字符匹配
// 匹配數字字符
String regex = "\\d"; // 等效于[0-9]
System.out.println("8".matches(regex)); // true// 特殊字符轉義
String regex2 = "\\$\\d+\\.\\d{2}"; // 匹配$12.34格式
System.out.println("$99.99".matches(regex2)); // true
-
預定義字符類 | 表達式 | 說明 | |--------|-----------------------| |
\d
| 數字:[0-9] | |\D
| 非數字:[^0-9] | |\s
| 空白字符:[\t\n\x0B\f\r] | |\w
| 單詞字符:[a-zA-Z_0-9]| -
量詞
String regex = "a{2,4}"; // 匹配2到4個a
System.out.println("aaa".matches(regex)); // true
- 邊界匹配
// 匹配完整行
String regex = "^\\d{3}-\\d{4}$";
System.out.println("123-4567".matches(regex)); // true
三、分組與反向引用
Pattern pattern = Pattern.compile("(\\d{3})-(\\d{4})");
Matcher matcher = pattern.matcher("123-4567");
if(matcher.find()){System.out.println(matcher.group(0)); // 123-4567System.out.println(matcher.group(1)); // 123System.out.println(matcher.group(2)); // 4567
}
四、常用方法實戰
- 字符串分割
String[] parts = "apple,banana;cherry".split("[,;]");
// ["apple", "banana", "cherry"]
- 替換操作
String result = "18812345678".replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
// 188****5678
- 復雜匹配驗證
// 郵箱驗證正則
String emailRegex = "^[\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+[a-zA-Z]{2,7}$";
System.out.println("test@example.com".matches(emailRegex)); // true
五、高級應用示例
- 提取HTML內容
String html = "<div><h1>Title</h1><p>Content</p></div>";
Pattern tagPattern = Pattern.compile("<([a-zA-Z]+)>(.*?)</\\1>");
Matcher m = tagPattern.matcher(html);while(m.find()){System.out.println("標簽:" + m.group(1) + " 內容:" + m.group(2));
}
// 輸出:
// 標簽:h1 內容:Title
// 標簽:p 內容:Content
- 日志分析
String log = "2023-08-20 14:23:45 [INFO] User login: id=12345";
Pattern logPattern = Pattern.compile("(\\d{4}-\\d{2}-\\d{2}) " + // 日期"(\\d{2}:\\d{2}:\\d{2}) " + // 時間"\\[(\\w+)\\] " + // 日志級別"(.+)"); // 消息內容Matcher m = logPattern.matcher(log);
if(m.find()){System.out.println("時間:" + m.group(1) + " " + m.group(2));System.out.println("級別:" + m.group(3));System.out.println("消息:" + m.group(4));
}
六、性能優化建議
- 預編譯Pattern對象
// 多次使用的正則應預編譯
private static final Pattern DATE_PATTERN = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
- 避免過度回溯
// 差:(a+)*b
// 優:a+b
- 合理使用懶惰量詞
// 匹配最短內容
<.*?> // 懶惰匹配
七、常見問題解決
- 中文匹配
String chineseRegex = "[\\u4e00-\\u9fa5]+";
System.out.println("中文測試".matches(chineseRegex)); // true
- 多行匹配模式
Pattern multiLine = Pattern.compile("^\\d+", Pattern.MULTILINE);
String input = "123\n456";
Matcher m = multiLine.matcher(input);
while(m.find()){System.out.println(m.group()); // 輸出123和456
}
- 大小寫不敏感
Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
八、調試工具推薦
- 在線驗證工具:regex101.com
- IDEA內置正則調試器
- Regex Tester插件
通過系統學習正則表達式,可以顯著提升文本處理效率。建議從簡單模式開始實踐,逐步掌握復雜表達式編寫技巧,同時注意特殊字符轉義和性能優化問題。