Skip to content

正则表达式在Java中的使用及常见场景


一、是什么?

正则表达式(Regular Expression)是一种用特定语法描述的字符串匹配模式,用于在文本中搜索、匹配或替换符合规则的字符串。在Java中通过 java.util.regex 包实现,核心类包括:

  • Pattern:编译正则表达式
  • Matcher:执行匹配操作

二、解决什么问题

  1. 复杂字符串验证:如邮箱、手机号格式校验
  2. 文本提取:从日志/文本中提取特定数据(如IP地址)
  3. 批量替换:快速修改文本格式(如日期格式转换)
  4. 字符串分割:按复杂规则拆分字符串(如多分隔符)

三、核心方法

方法所属类说明
Pattern.compile(String regex)Pattern编译正则表达式
matcher(CharSequence input)Pattern创建Matcher对象
matches()Matcher全文本匹配
find()Matcher查找下一个匹配
group()Matcher获取匹配内容
replaceAll(String replacement)String全局替换

四、应用场景(代码题常见情况)

1. 格式验证

java
// 验证手机号(1开头,11位数字)
String regex = "^1[3-9]\\d{9}$";
System.out.println("13812345678".matches(regex)); // true

2. 文本提取

java
// 提取文本中所有日期(格式:YYYY-MM-DD)
String text = "2023-01-15记录 2024-05-20更新";
Pattern p = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
Matcher m = p.matcher(text);
while (m.find()) {
    System.out.println(m.group()); // 输出两个日期
}

3. 字符串分割

java
// 按多种符号分割
String str = "apple,banana;orange|grape";
String[] fruits = str.split("[,;|]");
// 结果: ["apple", "banana", "orange", "grape"]

4. 替换操作

java
// 隐藏手机号中间4位
String phone = "13812345678";
String masked = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
// 结果: 138****5678

五、JDK8+新特性

  1. Pattern.asPredicate()
    将正则转为Predicate,用于Stream过滤

    java
    List<String> emails = Arrays.asList("a@test.com", "invalid");
    Pattern emailPattern = Pattern.compile(".+@.+\\..+");
    emails.stream()
          .filter(emailPattern.asPredicate())
          .forEach(System.out::println); // 输出有效邮箱
  2. Matcher.replaceAll(Function)
    动态替换匹配内容

    java
    Matcher m = Pattern.compile("\\d+").matcher("a1b23c");
    String result = m.replaceAll(match -> String.valueOf(Integer.parseInt(match.group()) * 2));
    // 结果: "a2b46c"

六、常用正则模式速查

场景正则表达式说明
邮箱\w+@\w+\.\w+基础邮箱校验
中文[\u4e00-\u9fa5]匹配单个汉字
IP地址`((25[0-5]2[0-4]\d
URLhttps?://\S+HTTP/HTTPS链接
日期\d{4}-\d{2}-\d{2}YYYY-MM-DD格式

七、重要注意事项

  1. 性能优化

    • 多次使用的正则用 Pattern.compile() 预编译
    • 避免回溯爆炸(如避免嵌套量词 (a+)+
  2. 特殊字符转义

    • 元字符 . * + ? ^ $ | \ ( ) [ ] { } 需用 \\ 转义
      (例如匹配点号需写 \\.
  3. 贪婪 vs 懒惰匹配

    • 默认贪婪模式(尽可能多匹配),添加 ? 变懒惰(尽可能少)
    java
    "a<b>c</b>d".replaceAll("<.*>", ""); // 贪婪: 空字符串
    "a<b>c</b>d".replaceAll("<.*?>", ""); // 懒惰: "acd"
  4. 分组引用

    • () 捕获分组,$1 $2 引用分组

八、总结

正则表达式是处理字符串的瑞士军刀,在Java中通过:

  1. 匹配验证String.matches()
  2. 提取数据Matcher.find() + group()
  3. 文本替换replaceAll()
  4. 复杂分割split()

代码题高频场景:数据清洗、格式校验、日志解析。掌握常用模式(邮箱、手机号、日期)和JDK8新特性可显著提升编码效率!