Java正则表达式深度解析与应用指南
核心类概览
Java正则表达式体系围绕两个核心类构建:
- java.util.regex.Pattern
- 表示编译后的正则表达式对象
- 线程安全,可重复使用
- 创建方式:
Pattern.compile(String regex)
- java.util.regex.Matcher
- 执行匹配操作的引擎
- 通过
pattern.matcher(input)
获取 - 包含丰富的匹配操作方法
基础示例:
java
// 匹配日期格式
Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
String input = "2023-08-15 2024-01-01";
Matcher matcher = pattern.matcher(input);
while(matcher.find()) {
System.out.println("发现匹配: " + matcher.group());
}
Pattern类深度解析
编译与模式设置
java
// 基础编译
Pattern p1 = Pattern.compile("a.b+");
// 使用模式修饰符(两种等效方式)
Pattern p2 = Pattern.compile("(?i)a.b+");
Pattern p3 = Pattern.compile("a.b+", Pattern.CASE_INSENSITIVE);
// 组合模式
Pattern p4 = Pattern.compile("(?is)a.b+");
Pattern p5 = Pattern.compile("a.b+",
Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
核心方法解析
1. 快速匹配检测
java
boolean isValid = Pattern.matches("\\d{6}", "123456"); // true
boolean isInvalid = Pattern.matches("\\d{6}", "abc123"); // false
2. 字符串分割
java
String log = "ERROR|2023-08-15|MainServer|DiskFailure";
Pattern delimiter = Pattern.compile("\\|");
String[] parts = delimiter.split(log);
// 结果:["ERROR", "2023-08-15", "MainServer", "DiskFailure"]
带Limit参数的分割:
java
String data = "a,b,c,d,e";
Pattern comma = Pattern.compile(",");
System.out.println(Arrays.toString(comma.split(data, 2)));
// 输出: [a, b,c,d,e]
System.out.println(Arrays.toString(comma.split(data, 0)));
// 输出: [a, b, c, d, e](自动去除尾部空元素)
3. 特殊字符转义
java
String dangerous = "a*.b";
String safeRegex = Pattern.quote(dangerous);
System.out.println("a*.b".matches(safeRegex)); // true
Matcher类实战指南
匹配信息获取
java
Pattern p = Pattern.compile("(\\d{2}):(\\d{2})");
Matcher m = p.matcher("会议时间:09:30 至 15:45");
while(m.find()) {
System.out.println("完整匹配: " + m.group());
System.out.println("小时部分: " + m.group(1));
System.out.println("分钟部分: " + m.group(2));
System.out.println("起始位置: " + m.start());
System.out.println("结束位置: " + m.end());
}
替换操作
java
String original = "John:123, Alice:456";
Pattern pattern = Pattern.compile("(\\w+):(\\d+)");
Matcher matcher = pattern.matcher(original);
String result = matcher.replaceAll("$2 => $1");
System.out.println(result);
// 输出: 123 => John, 456 => Alice
String类正则方法精要
1. 快速验证
java
boolean isValidEmail = "user@example.com".matches("\\w+@\\w+\\.\\w+");
2. 智能替换
java
String datedContent = "Created on 2023-08-15, Updated 2023-08-16";
String americanDate = datedContent.replaceAll(
"(\\d{4})-(\\d{2})-(\\d{2})",
"$2/$3/$1"
);
// 结果: Created on 08/15/2023, Updated 08/16/2023
3. 高效分割
java
String csv = "Apple,Orange,,Banana";
String[] fruits = csv.split(",", -1);
// 结果: ["Apple", "Orange", "", "Banana"]
关键技巧与陷阱规避
特殊字符处理表
字符 | 正确转义 | 错误示例 |
---|---|---|
. | \. | split(".") |
| | ||
\ | \\ | split("\") |
* | \* | split("*") |
分割最佳实践
java
String logLine = "INFO|20230815|SYSTEM|STARTUP";
String[] parts = logLine.split("\\|"); // 正确分割竖线
性能优化建议
- 重复使用的Pattern应缓存
- 复杂匹配优先使用预编译Pattern
- 简单操作可使用String直接方法
进阶应用示例
多模式匹配
java
Pattern multiPattern = Pattern.compile(
"(?i)error|warning|critical",
Pattern.CASE_INSENSITIVE
);
Matcher logMatcher = multiPattern.matcher(logContent);
while(logMatcher.find()) {
System.out.println("发现异常级别: " + logMatcher.group());
}
分组替换
java
String phoneNumbers = "客服电话:010-1234567,紧急电话:020-7654321";
String formatted = phoneNumbers.replaceAll(
"(\\d{3})-(\\d{7})",
"($1) $2"
);
// 结果: 客服电话:(010) 1234567,紧急电话:(020) 7654321
通过系统化的学习和实践这些正则表达式技巧,开发者可以高效处理各种文本操作需求,提升代码质量和执行效率。