Skip to content

Java正则表达式深度解析与应用指南

核心类概览

Java正则表达式体系围绕两个核心类构建:

  1. java.util.regex.Pattern
  • 表示编译后的正则表达式对象
  • 线程安全,可重复使用
  • 创建方式:Pattern.compile(String regex)
  1. 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

通过系统化的学习和实践这些正则表达式技巧,开发者可以高效处理各种文本操作需求,提升代码质量和执行效率。

文章来源于自己总结和网络转载,内容如有任何问题,请大佬斧正!联系我