java-正则表达式

一、正则表达式能干什么?

  • 验证格式:手机号、邮箱、日期
  • 提取数据:从日志/文本中抓取关键信息
  • 替换文本:批量修改字符串内容

二、Java正则核心API

Java中用 java.util.regex 包的两个类:

  1. Pattern:编译正则表达式
  2. Matcher:执行匹配操作
java 复制代码
// 快速匹配示例
String regex = "\\d+";  // 匹配数字
boolean isMatch = Pattern.matches(regex, "123"); // true

// 提取数据示例
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("价格:99元,库存:5");
while(matcher.find()) {
    System.out.println(matcher.group()); // 输出 99 和 5
}

三、5个必会语法(附Java代码)

1. 基础匹配
符号 说明 Java示例 匹配结果
\d 数字 "a\\d" a1, a9
\w 字母数字下划线 "\\w+" hello, user1
. 任意字符 "a.c" abc, a@c
^ 开头 "^Java" Java真好用
$ 结尾 "end$" 这是end
2. 量词(控制次数)
符号 说明 示例 匹配内容
? 0或1次 "a?" "", a
+ 1次或多次 "\\d+" 1, 123
* 0次或多次 "a*" "", aaaa
{n} 精确n次 "\\d{4}" 2023
3. 字符集合
java 复制代码
// 匹配元音字母
Pattern.compile("[aeiou]");    // 匹配 a, e, i 等
// 匹配非数字
Pattern.compile("[^0-9]");     // 匹配 a, @, # 等
4. 分组提取
java 复制代码
String text = "电话:188-1234-5678";
Pattern pattern = Pattern.compile("(\\d{3})-(\\d{4})-(\\d{4})");
Matcher matcher = pattern.matcher(text);
if(matcher.find()) {
    System.out.println(matcher.group(1)); // 188
    System.out.println(matcher.group(2)); // 1234
    System.out.println(matcher.group(3)); // 5678
}
5. 贪婪 vs 非贪婪
java 复制代码
// 贪婪模式(默认)
Pattern.compile("a.*b").matcher("aXXXbYYYb").find(); // 匹配整个字符串

// 非贪婪模式(加?)
Pattern.compile("a.*?b").matcher("aXXXbYYYb").find(); // 只匹配aXXXb

四、高频实战案例

1. 验证手机号
java 复制代码
String regex = "1[3-9]\\d{9}";
boolean isValid = "18812345678".matches(regex); // true
2. 提取邮箱
java 复制代码
String text = "联系我:admin@test.com 或 user@qq.com";
Pattern pattern = Pattern.compile("\\w+@\\w+\\.\\w+");
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
    System.out.println(matcher.group()); // 输出两个邮箱
}
3. 替换敏感信息
java 复制代码
String phone = "手机号:18812345678";
String masked = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
// 结果:手机号:188****5678

五、避坑指南(Java专属)

  1. 转义问题 :Java中 \ 要写两次

    java 复制代码
    // 错误写法:Pattern.compile("\d+"); 
    // 正确写法:
    Pattern.compile("\\d+");
  2. 性能优化 :复用 Pattern 对象

    java 复制代码
    // 不要每次编译(低效):
    for(...) {
        Pattern.matches(regex, text); 
    }
    
    // 正确做法:
    Pattern pattern = Pattern.compile(regex);
    for(...) {
        pattern.matcher(text).matches();
    }
  3. 边界检查 :用 ^$ 严格匹配

    java 复制代码
    // 可能意外匹配子串:
    "123abc".matches("\\d+"); // false(正确)
    "123".matches("\\d+");    // true
    
    // 错误示例:没有用^$导致误匹配
    "a1b2".matches("\\d+");   // false(正确)

总结 :正则表达式就是用符号描述字符串规则 ,多写多练才能掌握!遇到复杂需求时,先拆解再组合,Java的 PatternMatcher 能帮你轻松应对文本处理需求! 🚀

java 复制代码
// 快速测试你的正则(复制到main方法试试)
String regex = "你的正则";
String text = "测试文本";
System.out.println(text.matches(regex)); 
相关推荐
学习编程的Kitty18 分钟前
算法——位运算
java·前端·算法
斑点鱼 SpotFish23 分钟前
用Python可视化国庆期间旅游概况与消费趋势
开发语言·python·旅游
only-lucky26 分钟前
在Qt中使用VTK
开发语言·qt
用户9047066835736 分钟前
如何使用 Spring MVC 实现 RESTful API 接口
java·后端
刘某某.37 分钟前
数组和小于等于k的最长子数组长度b
java·数据结构·算法
程序员飞哥42 分钟前
真正使用的超时关单策略是什么?
java·后端·面试
用户9047066835744 分钟前
SpringBoot 多环境配置与启动 banner 修改
java·后端
小杰帅气1 小时前
类与对象1
开发语言·c++
chenyuhao20241 小时前
《C++二叉引擎:STL风格搜索树实现与算法优化》
开发语言·数据结构·c++·后端·算法
小old弟1 小时前
后端三层架构
java·后端