正则表达式
正则表达式模块是Hutool的核心模块之一,提供了丰富的正则表达式操作功能,简化了Java正则表达式的使用,使正则操作更加便捷高效。
# 模块概述
正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分割文本。Java内置了java.util.regex包来支持正则表达式,但使用起来相对复杂,需要编写大量的代码。
Hutool的正则表达式模块对Java原生正则表达式API进行了封装,提供了简洁易用的API,涵盖了以下功能:
- 正则匹配:判断字符串是否匹配指定的正则表达式
- 正则查找:查找字符串中匹配正则表达式的部分
- 正则替换:替换字符串中匹配正则表达式的部分
- 正则分割:使用正则表达式分割字符串
- 正则提取:提取字符串中匹配正则表达式的分组
- 正则缓存:内置正则表达式缓存机制,提高性能
- 常用正则:内置了大量常用正则表达式
# JDK正则表达式对比
# JDK正则表达式的不足
- API复杂:Java原生正则表达式API设计较为复杂,需要编写大量的代码
- 缺少常用正则:没有提供常用正则表达式的预定义
- 匹配结果处理繁琐:获取匹配结果需要多次调用Matcher的方法
- 性能开销:每次使用正则表达式都需要编译,性能开销较大
- 分组操作复杂:提取分组需要手动处理
- 异常处理繁琐:需要处理多种异常
# Hutool正则表达式模块的优势
- API简洁:提供了简洁易用的API,一个方法即可完成复杂的正则操作
- 常用正则内置:内置了大量常用正则表达式,如邮箱、手机号、URL等
- 匹配结果处理便捷:提供了便捷的方法来处理匹配结果
- 性能优化:内置正则表达式缓存机制,提高性能
- 分组操作便捷:提供了便捷的方法来提取分组
- 异常处理简化:将checked异常转换为runtime异常,避免繁琐的try-catch
- 功能丰富:提供了丰富的正则操作功能,满足各种需求
# 核心类结构
| 类名 | 主要功能 |
|---|---|
| ReUtil | 正则表达式工具类,提供了正则匹配、查找、替换、分割等功能 |
| PatternPool | 正则表达式模式池,用于缓存编译后的正则表达式 |
| RegexPool | 正则表达式池,提供了常用正则表达式的预定义 |
# 模块使用场景
正则表达式模块适用于以下场景:
- 文本验证:验证邮箱、手机号、URL等格式是否正确
- 文本提取:从文本中提取指定格式的内容
- 文本替换:替换文本中指定格式的内容
- 文本分割:使用正则表达式分割文本
- 日志分析:分析日志文件,提取关键信息
- 数据清洗:清洗数据,去除不符合要求的内容
- 网络爬虫:从网页中提取指定信息
# 快速开始
# 正则匹配
// 验证邮箱格式
boolean isEmail = ReUtil.isMatch("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "test@example.com");
// 输出: true
// 验证手机号格式
boolean isPhone = ReUtil.isMatch("^1[3-9]\\d{9}$", "13812345678");
// 输出: true
# 正则查找
// 查找字符串中的数字
String text = "abc123def456ghi789";
String result = ReUtil.get("\\d+", text, 0);
// 输出: 123
// 查找所有匹配的数字
List<String> results = ReUtil.findAllGroup0("\\d+", text);
// 输出: ["123", "456", "789"]
# 正则替换
// 替换字符串中的数字为"*"
String text = "abc123def456ghi789";
String result = ReUtil.replaceAll("\\d+", text, "*");
// 输出: abc*def*ghi*
// 替换字符串中的数字为其平方
String result2 = ReUtil.replaceAll("\\d+", text, matcher -> {
int num = Integer.parseInt(matcher.group());
return String.valueOf(num * num);
});
// 输出: abc15129def207936ghi622521
# 正则提取
// 提取URL中的域名
String url = "https://www.baidu.com/s?wd=hutool";
String domain = ReUtil.getGroup1("https?://([\\w.-]+)/", url);
// 输出: www.baidu.com
// 提取分组
String text = "name:张三,age:25";
String name = ReUtil.getGroup1("name:(\\w+),age:(\\d+)", text);
String age = ReUtil.getGroup2("name:(\\w+),age:(\\d+)", text);
// 输出: name=张三, age=25
# 正则分割
// 使用空格分割字符串
String text = "Hello World Hutool";
String[] parts = ReUtil.split("\\s+", text);
// 输出: ["Hello", "World", "Hutool"]
# 常用正则
// 使用内置的邮箱正则
boolean isEmail = ReUtil.isMatch(RegexPool.EMAIL, "test@example.com");
// 输出: true
// 使用内置的手机号正则
boolean isPhone = ReUtil.isMatch(RegexPool.MOBILE, "13812345678");
// 输出: true
// 使用内置的URL正则
boolean isUrl = ReUtil.isMatch(RegexPool.URL, "https://www.baidu.com");
// 输出: true
# 总结
正则表达式模块是Hutool的核心模块之一,提供了丰富的正则表达式操作功能,简化了Java正则表达式的使用。通过使用正则表达式模块,可以大大减少正则操作的代码量,提高开发效率。
无论是文本验证、文本提取、文本替换还是文本分割,正则表达式模块都能提供简洁高效的解决方案。其内置的常用正则表达式和缓存机制也提高了开发效率和性能。
接下来,我们将详细介绍正则表达式模块中的核心工具类ReUtil,帮助大家更好地理解和使用这些工具类。