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)); 
相关推荐
小灰灰搞电子41 分钟前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
魏 无羡1 小时前
webclient
java·webclient
神仙别闹1 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
传奇开心果编程2 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
新时代牛马2 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob2 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
m0_587383003 小时前
全民健身解决方案软件开发实战:从架构设计到落地指南
java·spring boot·spring·架构·需求分析
白山编程大哥3 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
shmily麻瓜小菜鸡4 小时前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
一技安身4 小时前
【信创】Docker‑Compose V2 两种离线部署(独立模式、插件模式)简易教程
java·docker·eureka